본문 바로가기

별걸다하는 IT/리눅스 유닉스

[리눅스/유닉스] jobs, fg, bg, &, nohup 명령어 - 프로세스 백그라운드로 돌려 실행하기, 포어그라운드로 돌리기

[리눅스 유닉스 완전정복 목차]

안녕하세요~!

양햄찌 블로그 주인장입니다. 

오늘은 포어그라운드&백그라운드 명령어에 관련된 포스팅을 들고 왔어요

 

포어그라운드 백그라운드가 뭔가요?

이미지출처: https://www.pinterest.co.kr/pin/280419514274385401/

쉽게 말해, 앞에서 돈다 = 포어그라운드, 뒤에서 돈다 = 백그라운드 입니다~

지금 저는 블로그 포스팅을 작성하면서 유투브 노래를 깔아놨는데요~~~

뒤에서 돌아가고 있는 유투브가 백그라운드에서 실행되고 있는거고, 지금 작성하고 있는 포스팅은 포어그라운드에서 실행되고 있는거겠죠~!

 

리눅스 유닉스에서 포어그라운드&백그라운드 명령어가 필요한 이유

윈도우야~ GUI기반이라 백그라운드 포어그라운드 명령어를 별도로 치지 않아도 마우스 클릭 포커싱만으로 이를 의도할 수가 있죠?

그런데 서버는 대게 텍스트모드 즉 콘솔과 같아요. 그러면 시간이 오래걸리는 작업같은 경우 백그라운드로 못돌리고 완료될때까지 기다려야하나..? ㄴㄴ 그렇지 않습니다. 운영체제자나요 그런 기능이 없을리가 없죠. 다만 명령어로 이를 조정한다는거??

오늘은 이를 위한 명령어를 알아보는 시간을 가질겁니다.

 

백그라운드에서 실행시키자 - &

아니~!! 파일시스템에 로그가 거의 풀찼어요~~! 가장 큰 로그 파일을 압축시켜서 보관하려고 해요.

아무래도 파일 크기가 큰만큼 압축하는대 시간이 오래걸리겠죠? 이런 것들은 뒷단에서 돌게 시키고 우리는 다른 일을 하는게 효율적이예요. 백그라운드에서 명령을 실행하려면 어떻게 해야할까?

간단합니다 명령어 뒤에 '&'를 붙여주면 돼요.

 

$ clear_logs.sh -n 20210127 & 
-> 'clear_logs.sh -n 20210127' 명령어를 백그라운드에서 실행하기 
$ split -50000b big_file.txt big_file.txt_a &
-> 'split -50000b big_file.txt big_file.txt_a' 명령어를 백그라운드에서 실행하기 

요런식으로~~ 보통은 작업이 오래걸리는 것들을 백그라운드로 실행을 많이 시키죠

'명령어 + & -> 명령어 백그라운드에서 실행하기'

포어그라운드 → 백그라운드 전환 - bg 명령어

오래 안걸릴 줄 알고 포어그라운드에서 실행시켰는대,, 기다려도 끝날 기미가 안보이네..

아 백그라운드로 돌려버리자! 

즉 포어그라운드 프로세스를 백그라운드로 돌리고 싶을 때에는 bg 명령어를 이용해주면 됩니다.

딱 봐도 BackGround의 약자 bg.

 

실습과정~

ubuntu@SERVER:/log > split -50000000b temp.20210127.log temp.20210127.log_a

엄청난 크기의 파일의 temp.20210127.log가 있다고 합시다. 파일이 너무 커서 로그를 확인하기가 어려워,

50000000 바이트를 기준으로 파일을 쪼개려고 해요. 위 명령어가 바로 그 명령어입니다!

실행시키면,,, 명령이 다 완수되기 전까지는 프롬프트가 뜨지 않아요.

ubuntu@SERVER:/log >

요런게 떠야 뭔가 입력을 하던 할텐데.. 생각보다 오래걸리네요? 그러면 백그라운드로 돌려버립시다!

 

1. ubuntu@SERVER:/log > split -50000000b temp.20210127.log temp.20210127.log_a
2. [1] + Stopped (SIGTSTP)  split -50000000b temp.20210127.log temp.20210127.log_a
3. ubuntu@SERVER:/log > bg
4. [1] + split -50000000b temp.20210127.log temp.20210127.log_a&
5. ubuntu@SERVER:/log > 
6. ubuntu@SERVER:/log > jobs
7. [1] + Done               split -50000000b temp.20210127.log temp.20210127.log_a
8. ubuntu@SERVER:/log > 

프롬프트가 안떠서 백그라운드로 돌리는 명령어인 bg조차도 입력할수가 없어요! 

이럴 경우에는 포어그라운드로 실행 중인 프로세스에 ctrl+z 를 눌러 작업을 일시중지 시킨 후에 bg 명령을 사용해서 백그라운드로 전환하면 됩니다.

 

라인별 해석

2번째 라인

: ctrl+z를 누르니까 현재 포어그라운드에서 돌던 명령어가 Stopped! 되었다고 뜨는 것을 확인할 수 있어요. 

3번째 라인

: 그리고 bg라는 명령어를 입력하니까 

4번쨰 라인

: 커맨드 뒤에 &가 추가적으로 붙어서 현재 백그라운드로 돌렸다는 것을 알려주는 문구를 확인할 수 있습니다.

5번째 라인 

: 백그라운드로 돌리면 이렇게 프롬프트가 뜹니다. 이제 우리가 셸에게 다른 작업을 명령할 수 있어요

6번째 라인

: 그래도 백그라운드에서 정말 돌고 있는건지 불안하다면 job라는 명령어로 어떤어떤 프로그램이 뒷단에서 돌고 있는지 확인해볼 수 있어요.

7번째 라인

: 백그라운드에 명령했던게 고 사이 다 실행이 되어서 Done 이라고 떴네요!

 

백그라운드에서 뭐 돌고 있지? - jobs 명령어

위의 실습에서 이미 사용해봤지만~~~

다시 정리하자면 jobs 명령어는 백그라운드에 실행되고 있는 프로세스나 중지된 프로세스의 목록을 출력해줍니다.

사진출처: http://linux-smart-help.blogspot.com/2013/04/how-to-multitask-in-linux-terminal-3.html

job 번호

job를 입력하고 결과를 보면 가장 첫 번째 열에 1,2,3,4 이런 숫자를 볼 수 있는대 이 숫자는 job 번호를 의미합니다.

중지되거나 백그라운드에서 돌고 싶은 작업이 있을 때 이 job 번호를 이용해서 앞단으로 가져와 실행시켜요.

 

jobs 기호

두번째 열에 보면 +, - 기호가 있는 프로세스들을 볼 수 있는데 

+는 fg나 bg 명령어를 쳤을 때 디폴트로 가장 먼저 가져와서 수행하게 될 프로세스를 의미합니다. (즉 현재 실행되고 있는 또는 실행예정인 넘)

-는 현재 진행중인 job이 끝나면 바로 다음에 수행될 프로세스를 의미해요.

 

jobs 상태

세 번째 Stopped 와 같이 보이는 이 표시는 job 상태를 의미합니다.  Stopped라는건 ctrl+z를 누르거나 ctrl_c 이런거 눌렀을 때 인터럽트에 의해 중지 또는 대기 상태의 프로세스를 의미하고

Running 돌고 있는거~

Done은 수행이 완료된 프로세스를 의미합니다 

백그라운드 → 포어그라운드 전환 - fg 명령어

반대로 백그라운드에 돌리던걸 포어그라운드에 전환하고 싶을 수도 있겠죠??

마찬가지로 ForeGroud의 약자로 보이는 fg 명령어를 사용하면 됩니다. 

 

뒷단에서 돌고 있는 프로세스 중 어떤 것을 앞단으로 가져와서 실행시킬까?? 

jobs 명령어 결과 중 '+'기호를 가지고 있는 프로세스를 가져와서 실행시키게 됩니다.

이미지출처: https://medium.com/@maxwell.obi/linux-basic-commands-knowing-your-environment-8ac0d59f5924

만약 뒷단에서 돌고 있는 프로세스가 여러 개인데, 나는 특정 프로세스를 포어그라운드로 가져오고 싶다! 이럴경우 %기호를 써서 가져오고 싶은 job_id를 지정해줄 수 있어요.

 

로그아웃하거나 터미널창이 닫혀도 멈추지마~  - nohup 명령어

nohup은 사용자가 로그아웃하거나 터미널창이 닫힌다고 실행중인 명령어가 중지되는게 아니라 뒤에서 계속 실행될수 있도록 해주는 명령어입니다. 

nohup gzip big_file.log & 

하지만 nohup은 자동으로 뒷단에 보내는 기능까지 하지는 못해서, 실행할 때 백그라운드에서 실행하게 해주는 &를 같이 붙여줘야 해요. 

위의 예시처럼 nohup 키워드를 쓰고 그 뒤에 명령어를 치고 마지막에 백그라운드 실행을 의미하는 &를 붙여주면 됩니다.

 

단순 명령어가 아니라 스크립트를 돌릴 때 (에러내용 출력내용 관리)

단순 명령어라면 사실 위와 같은 수행에서 큰 문제가 없는대..

만약에 스크립트나 프로그램의 경우 콘솔창에 로그가 띄어질수도 있고, 실패할 경우 에러 가 뜰 수도있고 그렇잖아요??

근대 백그라운드에서 수행되는데 로그는 터미널에 출력되면 안되니..

화면에 출력되는 내용을 파일에 저장할 수 있도록 리다이렉션 작업을 해주면 좋습니다.

 

[화면 출력내용이나 에러 내용을 파일로도 화면으로도 남기지 않게 할 때]

./clear_logs.sh -n 20190616 > /dev/null 2>&1 &

참고로 clear_logs.sh 는 특정 날짜에 발행된 로그파일들을 백업해주는 스크립트입니다 (개인 스크립트)

즉 명령어는 './clear_logs.sh -n 20190616'까지가 되는거~

 

[화면 출력 내용은 A.log 파일에, 에러 출력내용은 A.err 파일에 저장하기]

nohup ./clear_logs -n 20190616 > clearlogs.log 2> clearlogs.err & 

이번엔 터미널창이 닫혀도 뒷단에서 수행될 수 있게 nohup을 추가해봤어요.

'./clear_logs.sh -n 20190616' 명령어를 수행하고 출력된 문구들은 clearlogs.log 파일에 저장하고,

표준 에러 출력 내용은 clearlogs.err 파일에 저장해달라는 명령입니다.

 

오늘 포스팅은 여기까지입니다. 도움이 되셨다면 공감은 어떤가요? 

사소한 클릭이 작성자에게 큰 동기부여가 됩니다 :)