리눅스에서 터미널 종료시에도 프로세스 백그라운드에 유지

2023년 10월 17일 화요일
4분 소요
0회

요약

shellscript

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

shellscript

1

nohup {command} &

문제

서버에서 실행에 오래걸리는 cli 프로그램이나 서버를 실행한 후 터미널을 종료시키면, 실행했던 프로세스가 종료된다.

문제 해결

프로그램 없이 실행하기

실행 후 ctrl+z 키를 눌러 작업을 중지시키고 나온 뒤

shellscript

1

2

3

node index.js
# ctrl+z 입력
# [1]  + 1212197 suspended  node index.js

bg명령을 입력하여 백그라운드 상태로 전환한다.

shellscript

1

2

bg
# [1]  + 1212197 continued  node index.js

jobs명령을 실행해 [ID]형태로 표시되는 ID값을 확인한 후 disown %{ID}명령을 실행해 연결관계를 끊어두어야 한다. 단 이 방법을 사용하면 이후에는 jobs명령으로 확인할 수 없다.

nohup 사용하기

기본적으로 터미널 연결이 종료되면 SIGHUP(HUP)이라는 시그널이 전송되게 되는데, SSH를 통해 터미널로 접속하여 프로그램을 실행 중일 때, 연결이 끊기거나 세션이 종료되는 경우 HUP signal이 보내지게 되고 터미널에서 실행 중이던 모든 프로세스가 중지된다.

이떄 nohupno SIGHUP(HUP)의 약어로 프로세스를 실행한 터미널의 세션 연결이 끊기더라도 HUP signal에 반응하지 않게 프로그램을 실행시키는 명령어이다.

shellscript

1

nohup {command} &

위 명령을 실행하면 터미널을 종료하더라도 프로세스가 유지된다. 이때 기본적으로 nohup.out이라는 로그 파일을 작성해주는데, 로그가 필요하지 않다면 nohup {command} > /dev/null & 명령어로 실행할 수 있다.

백그라운드 프로세스 종료하기

먼저 실행중인 프로세스의 PID를 확인한다.

shellscript

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시그널을 보낸다.

shellscript

1

kill -15 {PID}

INFO

kill -15 {PID}명령으로 종료되지 않으면 강제 종료 시그널인 SIGKILL시그널을 보낸다.
SIGTERM명령으로 종료해야 정상 종료가 되므로 위에 명령어로 종료되지 않을때만 사용하면 좋다.

shellscript

1

kill -9 {PID}

Loading reactions

© 2024 Hopoduck. All rights reserved.