2013-07-17 66 views
2

我在做这样的事情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 

一切都很好,甚至与忽视之外,所有我处理的线程结束,因为他们应该。我很好奇我做错了什么,以及如何摆脱忽略的异常错误。

回答

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) 
相关问题