SIGTERM이란?

  • 유닉스 기반의 프로세스 종료 신호
  • SIG_KILL과 반대
  1. 정의와 목적:
    • SIGTERM은 프로세스에게 정상적으로 종료할 것을 요청하는 신호.
    • 프로세스가 자원을 정리하고 안전하게 종료할 수 있도록 하는 "부드러운" 종료 방식이다.
  2. 신호 번호:
    • SIGTERM의 표준 신호 번호는 15이다.
  3. 동작 방식:
    • 프로세스는 SIGTERM을 받으면 정리 작업을 수행한 후 종료
    • 프로세스는 이 신호를 무시하거나 다르게 처리하도록 프로그래밍될 수 있다.
  4. 사용 사례:
    • 시스템 종료 시: 운영 체제가 종료될 때 실행 중인 프로세스들에게 SIGTERM을 보냅니다.
    • 프로세스 관리: 관리자나 사용자가 프로세스를 정상적으로 종료하고자 할 때 사용합니다.
    • 컨테이너 환경: Docker나 Kubernetes에서 컨테이너를 정상 종료할 때 SIGTERM을 사용합니다.
  5. SIGKILL과의 차이:
    • SIGTERM은 프로세스가 정리 작업을 수행할 기회를 제공하지만, SIGKILL(신호 번호 9)은 즉시 강제 종료한다.
    • SIGTERM은 프로세스가 무시할 수 있지만, SIGKILL은 무시할 수 없다.
  6. 프로그래밍에서의 처리:
    • 프로그래머는 SIGTERM 핸들러를 구현하여 프로세스가 이 신호를 받았을 때의 동작을 정의할 수 있습니다.
    • 일반적으로 열린 파일을 닫고, 네트워크 연결을 정리하고, 임시 파일을 삭제하는 등의 작업을 수행합니다.
  7. 시스템 동작:
    • 프로세스가 SIGTERM을 받고 일정 시간 내에 종료되지 않으면, 시스템은 SIGKILL을 보내 강제 종료할 수 있습니다.
  8. 명령어 사용:
    • Unix/Linux 시스템에서 'kill' 명령어를 사용하여 SIGTERM을 보낼 수 있습니다. (예: kill -15 [PID] 또는 단순히 kill [PID])
  9. 그레이스풀 셧다운(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 리눅스 종료 신호

 

SIGKILL vs SIGTERM 리눅스 종료 신호

우리가 만든 서버 프로그램은 리눅스 서버의 한 프로세스로 동작 합니다.고로, 프로세스로 구동하는 모든 프로그램들, 예) 도커, nginx, node.js, Mysql 등의 종료에 관한 메커니즘을 이해 한다면, 장

velog.io

+ Recent posts