Python

[Python] signal - 프로그램 종료 처리

비번변경 2025. 1. 20. 00:47

개요

2025.01.08-[Python] KeyboardInterrupt - 프로그램 종료 처리에서 키보드 입력에 의한 프로그램 종료를 처리하는 방법을 알아보았는데, 프로그램은 동작 중 예기치 않게 종료되거나 SIGTERM 등의 시그널에 의해 종료될 수도 있다. 이번 글에서는 Python 프로그램에서 시그널을 처리하는 방법을 적어둔다.

 

 

signal.signal

Python의 signal 모듈의 signal 함수는 시그널을 수신받을 때 실행할 사용자 정의 처리기를 정의하고 등록할 수 있게 한다. 

signal.signal(signalnum, handler)

매개변수로 수신받을 시그널 값과 처리한 작업이 정의된 함수 hander를 전달한다. hander는 signum(시그널 번호)과 frame(현재 스택 프레임)을 매개변수로 가지고 있어야 한다. 또는 signal.SIG_IGN, signal.SIG_DFL을 handler로 지정할 수도 있다.

 

 

예시

바로 예시로 사용방법을 알아보자.

 

예로 들어, 다음과 같이 10초에 한 번씩 "대기중..."이라는 문자열을 출력하는 프로그램이 있다고 하자.

import time

def execute():
    while True:
        print("대기중...")
        time.sleep(10)

def main():
    execute()

if __name__ == '__main__':
    main()

이 프로그램이 동작하는 중간에 SIGINT, SIGTERM과 같은 시그널을 받으면 '프로그램 종료'라는 문자열을 출력하고 종료하려고 한다.

이를 위해 아래와 같이 시그널을 수신받았을 때 실행시킬 함수를 선언하고, signal.signal 함수로 등록한다.

def shutdown_handler(signum, frame):
    print(f'{signum}, {frame}')
    print('프로그램 종료')
    exit()
    
if __name__ == '__main__':
    signal.signal(signal.SIGINT, shutdown_handler)
    main()

참고로 기존 동작을 무시하고 등록한 handler로 동작하기 때문에 프로그램 종료 시그널인 경우에는 별도로 종료 처리를 해야 하는 것 같다.

 

 

시그널 무시

만약 특정 signal을 무시하고 싶을 때는 handler에 signal.SIG_IGN를 전달하면 된다.

signal.signal(signal.SIGINT, signal.SIG_IGN)

 

 

참고 문서

https://docs.python.org/ko/3.10/library/signal.html

https://wikidocs.net/126014

https://positive-impactor.tistory.com/185