리눅스 백그라운드(background)에서 실행 하기

Reading time ~1 minute

백그라운드 실행??

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]와 같이 앞에 숫자가 나옵니다.

백그라운드1

이는 작업에 대한 ID 값으로

jobs

jobs 명령어를 통해 각각의 프로세스에 대한 job ID를 알 수 있습니다. 이 번호를 이용해서

fg %1

포그라운드로 옮기고 싶은 ID를 입력하면 됩니다.

2. 포그라운드에서 백그라운드로

프로세스가 포그라운드로 돌고 있다면 키보드 입력이 안된다고 했는데 그럼 어떻게 해야 할까요?

Ctrl + Z

백그라운드2

Ctrl + Z를 입력하시면 정지됐다는 알림이 보입니다. jobs를 쳐도 정지 상태인 걸 볼 수 있습니다. 이때

bg %1

를 입력하시면 됩니다.


끝내기

kill %1

백그라운드 시에는 kill를 통해 바로 죽일 수 있고, 포그라운드인 경우 Ctrl + Z로 정지시킨 다음 kill을 입력하시거나 익숙한(?) Ctrl + C를 입력하시면 바로 멈춥니다.

여기까지 보시면 의문점을 가지시는 분들이 있을 겁니다. 포그라운드로 실행 시엔 키보드 입력이 안된다고 했는데 Ctrl + Z, Ctrl + C는 어떻게 입력이 된 걸까요???

이게 가능 한 이유는 인터럽트, 시그널이라는 것이 존재하며 이외에도 표준 입출력, nohup 명령, 하드웨어/소프트웨어 인터럽트 등등 재미난 주제들이 있는데 기회가 된다면 차후에 소개해 드리도록 하고 현재로서는 간단히 Ctrl + C나 Ctrl + Z는 강제적인 명령(강제 종료 같은)을 내리는 단축키라고 생각하시면 됩니다.

만약 인터럽트에 대해 궁금하시다면 여기를 참고 해주세요.