DevOps, Infra

Linux 에서 정상적으로 프로세스를 중지하는 방법, Graceful Shutdown

seulseul 2023. 3. 13. 22:33

Graceful Shutdown ?

IT 쪽에서 graceful 의 의미는 "(유예를 가지고 있는) 부드러운/깔끔한/적합한"의미를 가지고 있다.
그래서 graceful shutdown 은 "(유예를 두는) 깔끔한 정상 종료", 혹은 의역하면 "깔끔하게 정상적인 종료를 하기위해 기다려줄 수 있는 것"의 늬앙스를 담아서 해석하는게 맞다.
그러므로 graceful close, graceful shutdown은 Process 의 요청 처리 과정에  있어서 유예 기간(다른 말로 타임아웃으로 이해해도 된다.)을 두고 앞서 전송된 요청 모두가 정상적으로 처리된 뒤에 깔끔하게 끊는 것을 말한다.
 

참고 : 오류를 잡자 : TCP에는 우아한 종료라는 것은 없다.

 
 

SIGTERM 과 SIGKILL 의 차이점

Graceful Shutdown 을 이해하려면 SIGTERM, SIGKILL에 대한 이해도 요구되므로 SIGTERM과 SIGKILL 을 일단 그림으로 비교해볼 수 있다.

출처 : https://dzone.com/articles/the-real-reason-to-not-use-sigkill-comic

위 그림에서 SIGTERM은 자식에게 가기 전에 인사할 시간을 주는데, 이는 프로세스에게 종료전 유예시간을 주는 것이다.
그러나 SIGKILL 은 자식에게 인사할 시간을 주지않는다. 이는 자식 프로세스를 정리할 시간이나, 시스템에 치명적인 영향이 될수 있는 요청을 처리할 시간을 주지않고 즉시 프로세스를 종료시키는 것이다.
이는 데이터가 유실되거나 리소스가 제대로 닫히지 않는 문제가 발생할 수 있다.
 
 
 
리눅스에서 kill 은 프로세스에 시그널에 보내는 명령어로 Signal 을 받은 프로세스의 기본 동작이 종료이다.
Signal 종류는 아래와 같다.

$ kill -l

1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

 

kill -9 {PID} 는 위 Signal 목록에 정의돼있는 SIGKILL 과 동일하다.
 

# 아래 두 명령어는 동일한 역할을 수행한다.
kill -TERM {프로세스 PID}

kill -2 {프로세스 PID}

SIGKILLSIGTERM 의 차이점을 이해했다면, Java, Spring 관련 프로세스를 종료시킬때  kill -9 {프로세스 PID} 가 아닌, 
kill -TERM {프로세스 PID}  혹은 kill -INT {프로세스 PID} 명령어로 종료시켜야한다는 것을 알수 있다.


참고

Unix, Linux 에서 kill 명령어로 안전하게 프로세스 종료 시키는 방법
 

 

'DevOps, Infra' 카테고리의 다른 글

[CI/CD] Advanced GitLab CI, gitlab-ci.yml  (0) 2023.09.14
Lens 대신 k9s 를 사용해보자  (0) 2023.07.09
[Ansible] include vs import  (0) 2023.03.09
vagrant multi machine (multi vm)  (0) 2023.02.24
베이그런트 (Vagrant) Cheat Sheet  (0) 2023.01.24