리눅스 bg fg 전환 방법을 알아봅시다.

OS/리눅스 2023. 4. 14. 00:22

 리눅스에는 foreground process, background process가 있습니다. foreground process를 백그라운드로 돌게, background process를 foreground로 돌게 바꾸는 방법을 알아봅시다.

 


 먼저, foreground process입니다. sleep 100을 치면, 해당 terminal에서 100초동안 멈춰 있어요. 여기까지 정리해 봅시다. 제가 sleep 100을 터미널 tty1에서 입력하였습니다. 그러면, tty1과 sleep 100을 실행시킨 프로세스는 연결되어 있고, 100초가 지날 때 까지 유저와 커뮤니케이션을 하게 됩니다.

 

 

 뒤에 &를 붙이면 어떻게 될까요? sleep 100 &을 했는데도, 멈춰 있지 않습니다. sleep 100을 백그라운드로 실행시켰다고 생각하면 편합니다.

 

 

 요래 그려지겠네요. 정리하면 뒤에 &을 붙여서 실행하면 백그라운드 프로세스로 돌아간다. 입니다. 제가 sleep 100 &을 했기 때문에 터미널 tty의 뒤에서 돌아가고 있는 셈입니다. 데몬하고는 구분지어야 하는데요. 이건 기회 되면 한 번 정리해 보겠습니다.

 


 이제 sleep 100을 한 상태에서 ctrl Z를 입력해 봅시다. 그러면, suspend 상태가 되면서 제어권이 터미널로 넘어오게 됩니다. 이를 간단하게 도식화 해서 그려보면 아래와 같습니다.

 

 

 여기까지 별로 어렵지 않아요. 즉, foreground 프로세스가 실행되었을 때, ctrl + z를 누르면 suspend 상태가 된다. 정도만 기억하시면 됩니다. 혹은 signal을 보낼 수도 있습니다.

 

 

 ps -aux | grep sleep을 쳐서 sleep을 실행시킨 프로세스를 찾습니다. 보니까 9116이네요. kill -19 9116 (sigstop 시그널)을 날려 보겠습니다.

 

 그러면 sleep 프로세스가 signal 때문에 suspend 되었음을 볼 수 있어요.

 

 

 이제 jobs를 보면 1번 job이 sleep 100이 잡혀있음을 볼 수 있어요. bg %1을 입력해 보겠습니다.

 

 

 그러면 suspend 된 프로세스가 백그라운드로 실행됩니다. 이 경우에는 done까지 같이 출력되었는데요. 아마도 suspend를 시킨 지 너무 오래 되어서 그러지 않았을까 싶네요. 여기까지 정리해 봅시다.

 

 

 별로 어렵지 않지요? ctrl+z를 눌러도 되고, SIGSTOP을 보내도 됩니다. 둘의 차이점은 잡거나 무시될 수 있는 시그널이냐, 그렇지 않냐입니다.

 

 


 이제 background 프로세스를 foreground 프로세스로 돌게끔 만들어 봅시다.

 

 

 jobs -l을 입력해 보겠습니다. 그러면, 작업들의 리스트와 pid가 나옵니다. 저는 이 중에 2번 job을 suspend 시킬 겁니다.

 

 그럴려면 단순히 19번 signal, 혹은 stop signal을 9761번 process에게 넘겨주면 됩니다.

 

 

 혹은 fg %N으로 N번 job을 foreground process로 바로 전환할 수도 있습니다. 여기까지 정리하면 아래와 같습니다.