我对Python子进程有些麻烦,所以我写了一个非常简单的脚本:
import os
import sys
import time
pid = os.fork()
if pid:
#parent
time.sleep(30)
else:
#child
#os._exit(0)
sys.exit()
当父进程正在休眠时,我启动
ps fax | grep py[t]hon
我读了这个输出
2577 ? S 0:00 python /home/pi/python/GPIO/GPIODaemon.py restart
2583 ? Z 0:00 \_ [python] <defunct>
使用sys.exit()
或os._exit(0)
总是有一个Zombie进程,我无法理解原因。
处理我更复杂的代码我认为有一些资源可以让子进程保持锁定状态,但是在这个简化的代码中,子进程根本没有文件/套接字/数据库连接!为什么孩子过程被僵尸?
答案 0 :(得分:10)
要在Unix中清除子进程,您需要等待子进程,在{{3}处检查os.wait(),os.waitpid(),os.wait3()或os.wait4()之一。 }
至于为什么会这样,这是Unix的设计决定。子进程将其返回值保持在其进程状态,如果它消失,则您将没有返回值。 os.wait()还会返回返回值,然后释放子进程并释放所有关联的资源。
答案 1 :(得分:0)
我遇到了类似的问题:由spawnl
启动的流程,可能会结束或可能需要在特定点终止。我没有所有僵尸进程的解决方案是
def cleanup_subprocesses(self, pid):
try:
os.kill(pid, signal.SIGKILL)
except OSError:
pass
os.waitpid(self._pid, 0)
如果进程没有及时结束,它会被杀死,无论如何都会执行waitpid-command。
如果你的程序中没有任何好处,你知道,你不再需要这个过程了,这显然无济于事。