在研究Python守护进程后,我发现这篇文章是最强大的:http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/
现在我正在尝试在守护进程类中实现一个工作进程池,我相信它已经在工作了(我还没有彻底测试代码),除了关闭时出现一个僵尸进程。我已经阅读了需要等待子进程的返回代码,但我还不能确定我需要如何做。
以下是一些代码片段:
def stop(self):
...
try:
while 1:
self.pool.close()
self.pool.join()
os.kill(pid, SIGTERM)
time.sleep(0.1)
...
在这里,我尝试了
os.killpg
和一些 os.wait
函数,但没有改善。我还尝试了在 os.kill
前后使用 closing
/joining
池。目前这个循环永远不会结束,只要它遇到了 os.kill
,就会产生僵尸进程。 self.pool = Pool(processes=4)
出现在守护进程的 __init__
部分。从 start(self)
后执行的 run(self)
中,我将调用 self.pool.apply_async(self.runCmd, [cmd, 10], callback=self.logOutput)
。然而,在查看此问题之前,我想解决这个僵尸进程。如何在守护进程内正确实现池以避免出现僵尸进程?
runCmd()
函数中使用的超时,即signal.signal(signal.SIGALRM, self.handler)
。这里处理程序引发一个自定义异常,说明命令已经超过了分配的执行时间。为什么我需要这个处理程序?我以为 multiprocessing 在pool.close
和pool.join
中会处理它。坦白地说,我不知道进程从哪里来,因为我没有调用apply_async
,所以我没有工作进程或回调线程。 - Aaron Robinson