Python-如何优雅地处理SIGTERM信号?

发布于 2021-02-02 23:09:51

假设我们有一个用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()有机会优雅地停止运行?

关注者
0
被浏览
86
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    基于类的干净使用解决方案:

    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 :)"
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看