SIGTERM处理程序调用多次
问题描述:
我在做这样的事情SIGTERM处理程序调用多次
def exitHandler(self, *args):
self.stopThreads()
sys.exit(2)
,我注册这个函数在我self.run(与守护进程的PROGRAMM工作)
signal.signal(signal.SIGTERM, self.exitHandler)
self.stopThreads( )有时需要一段时间才能完成。我停止这些线程启动的子进程。当信号处理程序被调用多次,我得到的错误信息是这样的:
Exception SystemExit: 2 in <bound method Popen.__del__ of <subprocess.Popen object at 0x929d10c>> ignored
一切都很好,甚至与忽视之外,所有我处理的线程结束,因为他们应该。我很好奇我做错了什么,以及如何摆脱忽略的异常错误。
答
问题似乎是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)