SIGTERM Handler多次调用

时间:2013-07-17 16:15:28

标签: python signals sigterm

我正在做这样的事情

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

一切都很好,即使被忽略的异常,我的所有进程都会按照自己的意愿完成。我很好奇我做错了什么以及如何摆脱被忽略的异常错误。

1 个答案:

答案 0 :(得分: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)