>백엔드 개발 >파이썬 튜토리얼 >Python 데몬에서 SIGTERM 신호를 적절하게 처리하는 방법은 무엇입니까?

Python 데몬에서 SIGTERM 신호를 적절하게 처리하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-15 15:56:03507검색

How to Gracefully Handle SIGTERM Signals in Python Daemons?

SIGTERM 신호의 우아한 처리

데몬 작업에서 SIGTERM(TERM) 신호를 사용하여 프로세스를 종료하면 중요한 작업이 갑자기 중단될 수 있습니다. 이 문제를 해결하기 위해 이 신호를 적절하게 처리하는 방법을 살펴보겠습니다.

문제 설명

Python으로 작성된 간단한 데몬:

def mainloop():
    while True:
        # Perform important jobs
        # Sleep

시작-중지를 사용하여 데몬화 -daemon은 종료 시 SIGTERM(TERM)을 보냅니다. 중요한 작업(예: 2단계) 중에 신호가 수신되면 즉시 종료됩니다.

signal.signal() 사용

signal.signal(을 사용하여 신호 이벤트 처리를 시도합니다. signal.SIGTERM, 핸들러)는 현재 실행을 중단하고 제어를 핸들러로 리디렉션할 수도 있습니다.

해결책: 신호용 스레드 분리 처리

현재 실행이 중단되는 것을 방지하기 위해 TERM 신호를 처리하는 별도의 스레드를 생성할 수 있습니다. 이 스레드는 shutdown_flag = True를 설정하여 메인 루프가 정상적으로 종료되도록 할 수 있습니다.

구현

다음은 우아한 신호 처리를 위한 클래스 기반 솔루션입니다.

import signal
import time

class GracefulKiller:
  kill_now = False
  def __init__(self):
    signal.signal(signal.SIGINT, self.exit_gracefully)
    signal.signal(signal.SIGTERM, self.exit_gracefully)

  def exit_gracefully(self, signum, frame):
    self.kill_now = True

if __name__ == '__main__':
  killer = GracefulKiller()
  while not killer.kill_now:
    time.sleep(1)
    print("doing something in a loop ...")
   
  print("End of the program. I was killed gracefully :)")

이점

이 솔루션을 사용하면 데몬이 SIGTERM을 적절하게 처리하여 중요한 작업을 수행할 수 있습니다. 종료되기 전에 완료됩니다. 또한 멀티 스레드 환경에서 신호를 처리하기 위한 깔끔하고 유지 관리 가능한 구현을 제공합니다.

위 내용은 Python 데몬에서 SIGTERM 신호를 적절하게 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.