【问题标题】:SIGTERM Handler called multiple times多次调用 SIGTERM 处理程序
【发布时间】:2013-07-16 07:37:04
【问题描述】:

我正在做这样的事情

def exitHandler(self, *args):
    self.stopThreads()
    sys.exit(2)

我在 self.run 中注册了该函数(使用守护程序)

   signal.signal(signal.SIGTERM, self.exitHandler)

self.stopThreads() 有时需要一段时间才能完成。我正在停止由这些线程启动的子进程。当信号处理程序被多次调用时,我会收到如下错误消息:

Exception SystemExit: 2 in <bound method Popen.__del__ of <subprocess.Popen object at 0x929d10c>> ignored

一切都很好,即使我的所有进程都忽略了异常,线程也应该完成。我很好奇我做错了什么以及如何摆脱被忽略的异常错误。

【问题讨论】:

    标签: python signals sigterm


    【解决方案1】:

    问题似乎是stopThreads()sys.exit() 的工作不可重入,而第二个SIGTERM 会导致其中一个或两个被调用。

    现在,您无法阻止 SIGTERM 多次交付,但您可以重新设计逻辑以适应它。通常(通常是正确的)建议是重构您的信号处理程序以简单地设置一个标志,并在您的主循环中检查该标志:

    def termHandler(self, *args):
        global flag_exit
        global exit_code
    
        flag_exit = True
        exit_code = 2
    
    
    ... in the main loop ...
    
        while not flag_exit:
            do_work()
    
        self.stopThreads()
        sys.exit(exit_code)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      • 2019-05-05
      • 2016-04-13
      • 2021-08-27
      • 2021-02-05
      相关资源
      最近更新 更多