Skip to main content
 首页 » 编程设计

python之SIGTERM 处理程序被多次调用

2025年05月04日10hnrainll

我正在做这样的事情

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 

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

请您参考如下方法:

问题似乎是 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)