리눅스에서 터미널 종료시에도 프로세스 백그라운드에 유지
요약
1
2
3
4
5
6
node index.js
# ctrl+z 입력
# [1] + 1212197 suspended node index.js
bg
# [1] + 1212197 continued node index.js
disown %1
or
1
nohup {command} &
문제
서버에서 실행에 오래걸리는 cli 프로그램이나 서버를 실행한 후 터미널을 종료시키면, 실행했던 프로세스가 종료된다.
문제 해결
프로그램 없이 실행하기
실행 후 ctrl+z
키를 눌러 작업을 중지시키고 나온 뒤
1
2
3
node index.js
# ctrl+z 입력
# [1] + 1212197 suspended node index.js
bg
명령을 입력하여 백그라운드 상태로 전환한다.
1
2
bg
# [1] + 1212197 continued node index.js
jobs
명령을 실행해 [ID]
형태로 표시되는 ID
값을 확인한 후 disown %{ID}
명령을 실행해 연결관계를 끊어두어야 한다. 단 이 방법을 사용하면 이후에는 jobs
명령으로 확인할 수 없다.
nohup
사용하기
기본적으로 터미널 연결이 종료되면 SIGHUP(HUP)
이라는 시그널이 전송되게 되는데, SSH를 통해 터미널로 접속하여 프로그램을 실행 중일 때, 연결이 끊기거나 세션이 종료되는 경우 HUP signal
이 보내지게 되고 터미널에서 실행 중이던 모든 프로세스가 중지된다.
이떄 nohup
은 no SIGHUP(HUP)
의 약어로 프로세스를 실행한 터미널의 세션 연결이 끊기더라도 HUP signal
에 반응하지 않게 프로그램을 실행시키는 명령어이다.
1
nohup {command} &
위 명령을 실행하면 터미널을 종료하더라도 프로세스가 유지된다. 이때 기본적으로 nohup.out
이라는 로그 파일을 작성해주는데, 로그가 필요하지 않다면 nohup {command} > /dev/null &
명령어로 실행할 수 있다.
백그라운드 프로세스 종료하기
먼저 실행중인 프로세스의 PID
를 확인한다.
1
ps -ef | grep {command}
1
2
3
UID PID PPID C STIME TTY TIME CMD
root 3979928 3964967 0 20:34 ? 00:00:02 node index.js
...
프로세스에 SIGTERM
시그널을 보낸다.
1
kill -15 {PID}
INFO
kill -15 {PID}
명령으로 종료되지 않으면 강제 종료 시그널인 SIGKILL
시그널을 보낸다.SIGTERM
명령으로 종료해야 정상 종료가 되므로 위에 명령어로 종료되지 않을때만 사용하면 좋다.
1
kill -9 {PID}