Graceful Shutdown ?
IT 쪽에서 graceful 의 의미는 "(유예를 가지고 있는) 부드러운/깔끔한/적합한"의미를 가지고 있다.
그래서 graceful shutdown 은 "(유예를 두는) 깔끔한 정상 종료", 혹은 의역하면 "깔끔하게 정상적인 종료를 하기위해 기다려줄 수 있는 것"의 늬앙스를 담아서 해석하는게 맞다.
그러므로 graceful close, graceful shutdown은 Process 의 요청 처리 과정에 있어서 유예 기간(다른 말로 타임아웃으로 이해해도 된다.)을 두고 앞서 전송된 요청 모두가 정상적으로 처리된 뒤에 깔끔하게 끊는 것을 말한다.
참고 : 오류를 잡자 : TCP에는 우아한 종료라는 것은 없다.
SIGTERM 과 SIGKILL 의 차이점
Graceful Shutdown 을 이해하려면 SIGTERM, SIGKILL에 대한 이해도 요구되므로 SIGTERM과 SIGKILL 을 일단 그림으로 비교해볼 수 있다.
위 그림에서 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}
SIGKILL 과 SIGTERM 의 차이점을 이해했다면, 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 |