【发布时间】:2011-09-19 16:58:22
【问题描述】:
在研究了 python 守护进程之后,这个遍历似乎是最健壮的:http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/
现在我试图在守护进程类中实现一个工作池,我认为它正在工作(我没有彻底测试过代码),除了在关闭时我得到一个僵尸进程。我已阅读我需要等待孩子的返回码,但我只是无法确切知道我需要如何执行此操作。
这里有一些代码sn-ps:
def stop(self):
...
try:
while 1:
self.pool.close()
self.pool.join()
os.kill(pid, SIGTERM)
time.sleep(0.1)
...
在这里,我尝试了os.killpg 和许多os.wait 方法,但没有任何改进。我还玩过closing/joining 在os.kill 之前和之后的游泳池。就目前而言,这个循环永远不会结束,一旦它到达os.kill,我就会得到一个僵尸进程。 self.pool = Pool(processes=4) 出现在守护程序的 __init__ 部分。从start(self)之后执行的run(self),我将调用self.pool.apply_async(self.runCmd, [cmd, 10], callback=self.logOutput)。但是,我想在研究之前解决这个僵尸进程。
如何在守护进程中正确实现池以避免出现这种僵尸进程?
【问题讨论】:
-
您的守护程序中有处理 SIGCHLD 的处理程序吗?
-
不,我没有这样的处理程序。我拥有的唯一处理程序是我在
runCmd()函数中使用的超时,即signal.signal(signal.SIGALRM, self.handler)。在这里,处理程序抛出一个自定义异常,说明命令已超过分配的执行时间。为什么我需要这个处理程序?我认为多处理在pool.close和pool.join中解决了这个问题。坦率地说,我不知道进程来自哪里,因为我没有打电话给apply_async,所以我没有工人或回调线程。
标签: python daemon multiprocessing zombie-process