Python で書かれた次のような単純なデーモンがあると仮定しましょう。
def mainloop():
while True:
# 1. do
# 2. some
# 3. important
# 4. job
# 5. sleep
mainloop()
そして、これをデーモン化して、start-stop-daemon
デフォルトでSIGTERM
( TERM
) シグナルを送信します--stop
。
現在実行されているステップが であると仮定します#2
。そして、まさにこの瞬間にTERM
信号を送信しています。
何が起こるかというと、実行は直ちに終了します。
シグナル イベントを で処理できることがわかりましたsignal.signal(signal.SIGTERM, handler)
が、それでも現在の実行が中断され、 に制御が渡されますhandler
。
そこで、私の質問は、現在の実行を中断せずに、TERM
別のスレッドでシグナルを処理して、正常に停止できるshutdown_flag = True
ように設定できるかどうかです。mainloop()
ベストアンサー1
クラスベースの使いやすいソリューション:
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 :)")