SIGTERM이란?
- 유닉스 기반의 프로세스 종료 신호
- SIG_KILL과 반대
- 정의와 목적:
- SIGTERM은 프로세스에게 정상적으로 종료할 것을 요청하는 신호.
- 프로세스가 자원을 정리하고 안전하게 종료할 수 있도록 하는 "부드러운" 종료 방식이다.
- 신호 번호:
- SIGTERM의 표준 신호 번호는 15이다.
- 동작 방식:
- 프로세스는 SIGTERM을 받으면 정리 작업을 수행한 후 종료
- 프로세스는 이 신호를 무시하거나 다르게 처리하도록 프로그래밍될 수 있다.
- 사용 사례:
- 시스템 종료 시: 운영 체제가 종료될 때 실행 중인 프로세스들에게 SIGTERM을 보냅니다.
- 프로세스 관리: 관리자나 사용자가 프로세스를 정상적으로 종료하고자 할 때 사용합니다.
- 컨테이너 환경: Docker나 Kubernetes에서 컨테이너를 정상 종료할 때 SIGTERM을 사용합니다.
- SIGKILL과의 차이:
- SIGTERM은 프로세스가 정리 작업을 수행할 기회를 제공하지만, SIGKILL(신호 번호 9)은 즉시 강제 종료한다.
- SIGTERM은 프로세스가 무시할 수 있지만, SIGKILL은 무시할 수 없다.
- 프로그래밍에서의 처리:
- 프로그래머는 SIGTERM 핸들러를 구현하여 프로세스가 이 신호를 받았을 때의 동작을 정의할 수 있습니다.
- 일반적으로 열린 파일을 닫고, 네트워크 연결을 정리하고, 임시 파일을 삭제하는 등의 작업을 수행합니다.
- 시스템 동작:
- 프로세스가 SIGTERM을 받고 일정 시간 내에 종료되지 않으면, 시스템은 SIGKILL을 보내 강제 종료할 수 있습니다.
- 명령어 사용:
- Unix/Linux 시스템에서 'kill' 명령어를 사용하여 SIGTERM을 보낼 수 있습니다. (예: kill -15 [PID] 또는 단순히 kill [PID])
- 그레이스풀 셧다운(Graceful Shutdown):
- SIGTERM은 그레이스풀 셧다운을 구현하는 데 주로 사용됩니다. 이는 프로세스가 진행 중인 작업을 완료하고 리소스를 정리한 후 종료되도록 합니다.
SIGTERM은 프로세스를 안전하게 종료하기 위한 표준적인 방법으로, 시스템 관리와 애플리케이션 개발에서 중요한 역할을 합니다.
간단한 코드로 수행해 보기
코드
import signal
import time
import sys
def signal_handler(signum, frame):
print("Received SIGTERM. Cleaning up...")
# 여기에 정리 작업을 수행하는 코드를 작성합니다.
# 예: 파일 닫기, 네트워크 연결 종료 등
print("Cleanup finished. Exiting.")
sys.exit(0)
def main():
# SIGTERM 신호에 대한 핸들러 등록
signal.signal(signal.SIGTERM, signal_handler)
print("Process started. PID:", os.getpid())
print("Press Ctrl+C to exit")
try:
# 무한 루프로 프로세스 실행 상태 유지
while True:
time.sleep(1)
except KeyboardInterrupt:
print("Received KeyboardInterrupt. Exiting.")
if __name__ == "__main__":
main()
결과
- kill -TERM <PID>를 수행한 경우 (-15도 가능하다.)
- kill -9 <PID> 를 수행한 경우
SIGTERM 무시 및 다른 대안으로 교체
SIGTERM을 무시하거나 다른 작업을 수행하도록 만들어보는 경우에 다음 명령을 사용할 수 있다.
import signal
# SIGTERM 신호를 무시하도록 설정
signal.signal(signal.SIGTERM, signal.SIG_IGN)
import signal
import sys
def sigterm_handler(signum, frame):
print("SIGTERM 신호를 받았지만, 프로그램을 계속 실행합니다.")
signal.signal(signal.SIGTERM, sigterm_handler)
참고
SIGKILL vs SIGTERM 리눅스 종료 신호
우리가 만든 서버 프로그램은 리눅스 서버의 한 프로세스로 동작 합니다.고로, 프로세스로 구동하는 모든 프로그램들, 예) 도커, nginx, node.js, Mysql 등의 종료에 관한 메커니즘을 이해 한다면, 장
velog.io