백그라운드 실행??
python bg1.py
이와 같은 명령으로 아래 코드를 실행시키면
from time import sleep
while True :
print("bg1")
sleep(2)
2초 간격으로 bg1을 출력 시키는 작업이 무한히 반복되기 때문에 다른 작업이 안됩니다.
키보드 입력 또한 하나의 작업이기 때문에 아무것도 칠 수 없는 걸 경험하셨을 겁니다.
이는 해당 프로세스가 foreground(간단히 전면부)에서 실행되기 때문입니다.
python bg1.py &
맨 뒤에 &를 붙이는 것만으로 background에서 실행을 시킬 수 있습니다. 다들 눈치채셨겠지만 이렇게 되면 무한히 bg1을 출력하는 프로세스는 뒷단에서 작업이 돌고, 키보드를 입력받는다는 프로세스는 foreground에서 수행되고 있기 때문에 키보드 입력이 가능합니다.
실제로도 python 혹은 자바에서 jar를 실행시킬 때 무심코 복사해서 사용했던 명령들 뒤에 보면 &가 붙어 있었던 적도 있으실 겁니다.
background <-> foreground 전환하기
프로세스를 백그라운드, 포그라운드로 실행시키는 방법은 &를 붙인다는 차이는 알았습니다.
그러나 실수로 백그라운드로 실행시켜야 할 프로세스를 포그라운드로 실행시키거나 반대의 경우로 실행시켰다면 어떻게 전환할지 알아보도록 합시다.
1. 백그라운드에서 포그라운드로
백그라운드로 실행 시에 [1]와 같이 앞에 숫자가 나옵니다.
이는 작업에 대한 ID 값으로
jobs 명령어를 통해 각각의 프로세스에 대한 job ID를 알 수 있습니다. 이 번호를 이용해서
fg %1
포그라운드로 옮기고 싶은 ID를 입력하면 됩니다.
2. 포그라운드에서 백그라운드로
프로세스가 포그라운드로 돌고 있다면 키보드 입력이 안된다고 했는데 그럼 어떻게 해야 할까요?
Ctrl + Z
Ctrl + Z를 입력하시면 정지됐다는 알림이 보입니다. jobs를 쳐도 정지 상태인 걸 볼 수 있습니다. 이때
bg %1
를 입력하시면 됩니다.
끝내기
kill %1
백그라운드 시에는 kill를 통해 바로 죽일 수 있고, 포그라운드인 경우 Ctrl + Z로 정지시킨 다음 kill을 입력하시거나 익숙한(?) Ctrl + C를 입력하시면 바로 멈춥니다.
여기까지 보시면 의문점을 가지시는 분들이 있을 겁니다. 포그라운드로 실행 시엔 키보드 입력이 안된다고 했는데 Ctrl + Z, Ctrl + C는 어떻게 입력이 된 걸까요???
이게 가능 한 이유는 인터럽트, 시그널이라는 것이 존재하며 이외에도 표준 입출력, nohup 명령, 하드웨어/소프트웨어 인터럽트 등등 재미난 주제들이 있는데 기회가 된다면 차후에 소개해 드리도록 하고 현재로서는 간단히 Ctrl + C나 Ctrl + Z는 강제적인 명령(강제 종료 같은)을 내리는 단축키라고 생각하시면 됩니다.
만약 인터럽트에 대해 궁금하시다면 여기를 참고 해주세요.