Python-如何优雅地处理SIGTERM信号?
假设我们有一个用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()
有机会优雅地停止运行?
回答:
基于类的干净使用解决方案:
import signalimport 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 :)"
以上是 Python-如何优雅地处理SIGTERM信号? 的全部内容, 来源链接: utcz.com/qa/435618.html