Python で SIGTERM シグナルを適切に処理する
長時間実行される Python デーモンを使用する場合、SIGTERM などの終了シグナルを適切に処理することは、データ損失のないクリーンなシャットダウン。これには、現在の実行を一時停止し、必要なクリーンアップ タスクを実行して、プロセスを正常に終了する機能が含まれます。これを実現する方法は次のとおりです。
シグナル ハンドラーの使用
Python には、特定のシグナルのハンドラーを登録する signal.signal 関数が用意されています。 SIGTERM のハンドラーを登録すると、実行が終了する前にシグナルをインターセプトできます。ただし、質問で述べたように、ハンドラーは依然として現在の実行を中断し、制御をそれ自体に渡します。
シグナル処理に別のスレッドを使用します
現在の実行では、シグナル イベントを処理する別のスレッドを作成できます。これにより、メイン ループを中断することなく、シャットダウン関連のタスクをバックグラウンドで実行できるようになります。単純なクラスを使用した例を次に示します。
解決策:
import signal import threading 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 def mainloop(): killer = GracefulKiller() while not killer.kill_now: # Perform necessary tasks in the main loop time.sleep(1) print("doing something in a loop ...") if __name__ == '__main__': mainloop() # When the main loop exits, we have gracefully handled the termination signal print("End of the program. I was killed gracefully :)")
このソリューションでは、GracefulKiller クラスが SIGTERM のシグナル ハンドラーを登録します。シグナルが受信されると、kill_now フラグが True に設定されます。メインループはこのフラグをチェックし、それが True になるまで継続します。これにより、メイン ループは正常に終了する前に重要なタスクを完了できます。
別のスレッドまたはクラスベースのソリューションを使用することで、メインの実行を途中で強制終了することなく、終了シグナルを確実に処理できます。このアプローチにより、正常なシャットダウンを実行でき、データの整合性が保証され、デーモンが正常に終了します。
以上がPython で SIGTERM シグナルを適切に処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。