假设我们有一个用python编写的琐碎守护程序:
def mainloop(): while True: # 1. do # 2. some # 3. important # 4. job # 5. sleep mainloop()
我们将它守护起来start-stop-daemon,默认使用它发送SIGTERM(TERM)信号–stop。
start-stop-daemon
SIGTERM(TERM)
stop
假设当前执行的步骤是#2。此时此刻,我们正在发送TERM信号。
#2
发生的情况是执行立即终止。
我发现我可以使用处理信号事件,signal.signal(signal.SIGTERM, handler)但事实是它仍然会中断当前执行并将控制权传递给handler。
signal.signal(signal.SIGTERM, handler)
handler
因此,我的问题是-是否可以不中断当前执行,而是TERM在单独的线程(?)中处理信号,以便能够进行设置,shutdown_flag = True从而mainloop()有机会优雅地停止运行?
shutdown_flag = True
mainloop()
基于类的干净使用解决方案:
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 :)"