bash나 zsh에서는 작업 제어(job control)을 기본적으로 제공하고 있습니다. 현재 동작하고 있는 프로그램을 백그라운드로 보내거나 백그라운드에 있는 프로그램을 다시 꺼내서 사용하는 것도 가능합니다.

평소에 다음과 같이, 끝에 &을 붙여 명령어를 사용해본 적이 있다면 자신도 모르는 사이에 이미 사용하고 있다는 뜻입니다.

$ npm start &
[1] + running    npm start

이러한 백그라운드 프로세스 사용법에 대해 살펴보겠습니다.

& : 백그라운드에서 실행하기

먼저 간단하게 예제를 보겠습니다.
다음 예시는 간단하게 sleep을 사용하고 있습니다.
&와 함께 실행하면 백그라운드로 구동한다는 의미입니다.

$ sleep 10 &
[1] 3901
$ sleep 20 &
[2] 3902
$ sleep 30 &
[3] 3903

jobs 현재 실행하고 있는 작업 목록 확인하기

$ jobs
[1]   running    sleep 10
[2] - running    sleep 20
[3] + running    sleep 30

Ctrl + z: 현재 실행하고 있는 프로세스를 일시 정지하고 백그라운드로 보내기

tmux를 사용하고 있다면 이 키로는 동작하지 않을 수 있습니다.

$ vim hello
# <Ctrl + z>을 누름
[1] + 4049 suspended   vim hello

bg: 현재 실행하고 있는 프로세스를 정지하지 않고 백그라운드로 보내기

만약 백그라운드에서 일시 정지가 아니라 계속 구동하려고 한다면 어떻게 해야 할까요?

$ sleep 30

# <Ctrl + z>을 누름
[1] + 4050 suspended  sleep 30

$ bg %sleep

# 아래처럼 간단하게 가능
$ %sleep &
[1] - 4050 continued  sleep 30
$ jobs
[1] - 4050 running    sleep 30
$
[1] - 4050 done       sleep 30

fg: 다시 해당 프로세스를 포그라운드로 부르기

fg 뒤 인자는 직접 입력해도 되지만 tab 키를 누르면 알아서 자동완성 해줍니다.

$ fg %1
$ fg %vim\ hello

kill: 백그라운드 프로세스 제거하기

kill %2

nohup: logout 후에도 백그라운드에서 실행하기

& 를 붙여 명령을 백그라운드로 실행후 logout을 해버리면 현재 shell에서 명령이 종료가 되는데, nohup을 사용하면 로그아웃 후에도 명령이 백그라운드로 계속 실행됩니다. nohup은 리눅스, 유닉스에서 쉘스크립트파일 (*.sh)을 데몬형태로 실행시킵니다. 따라서 터미널 세션이 끊겨도 실행을 멈추지 않고 동작하도록 합니다.

다만, 이에 대한 내용을 전부 다루기 위해서는 조금 길어지므로 추후에 따로 다루겠습니다. ‘터미널 logout해도 실행하도록 하고 싶다’는 것에 관심이 있으신 분은 이런 설명이 잘 되있는 포스트 들을 참고하시기 바랍니다.

알고 나니 별 내용은 아니지만 지금까지 전혀 모르고 사용했다는 점에 반성하는 마음에서, 그리고 매번 백그라운드를 끌 줄 몰라서 kill을 당해야만 했던 수많은 프로세스를 추모하며 작성했습니다. 지금까지 몰랐다는게 참 억울하지만 앞으로는 프로세스 번호 찾으려고 애쓸 일이 없다는 점이 참 감사합니다.

References

Comments

Eungbean Lee's Picture

About Eungbean Lee

Lee is a Student, Programmer, Engineer, Designer and a DJ

Seoul, South Korea https://eungbean.github.io