デーモン操作では、SIGTERM (TERM) シグナルを使用してプロセスを終了すると、重要なタスクが突然中断される可能性があります。これに対処するために、このシグナルを適切に処理する方法を検討してみましょう。
Python で書かれた単純なデーモンがあるとします:
def mainloop(): while True: # Perform important jobs # Sleep
start-stop を使用してデーモン化する-daemon は終了時に SIGTERM (TERM) を送信します。重要な操作 (ステップ #2 など) 中にシグナルを受信した場合、シグナルは直ちに終了します。
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 中国語 Web サイトの他の関連記事を参照してください。