ホームページ  >  記事  >  バックエンド開発  >  Python デーモンで SIGTERM シグナルを適切に処理するにはどうすればよいですか?

Python デーモンで SIGTERM シグナルを適切に処理するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-15 15:56:03419ブラウズ

How to Gracefully Handle SIGTERM Signals in Python Daemons?

SIGTERM シグナルの正常な処理

デーモン操作では、SIGTERM (TERM) シグナルを使用してプロセスを終了すると、重要なタスクが突然中断される可能性があります。これに対処するために、このシグナルを適切に処理する方法を検討してみましょう。

問題ステートメント

Python で書かれた単純なデーモンがあるとします:

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

start-stop を使用してデーモン化する-daemon は終了時に SIGTERM (TERM) を送信します。重要な操作 (ステップ #2 など) 中にシグナルを受信した場合、シグナルは直ちに終了します。

Using 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。