[Python] signal - 프로그램 종료 처리
개요
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://positive-impactor.tistory.com/185