我对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)
总会有一个僵尸进程,我不明白为什么。
在处理更复杂的代码时,我认为有一些资源是子进程锁定的,但在这个简化的代码中,子进程根本没有文件/套接字/数据库连接!为什么子进程被僵尸了?
发布于 2013-08-06 20:54:08
要清除Unix中的子进程,您需要等待该子进程,请选中http://docs.python.org/2/library/os.html#os.wait中的os.wait()、os.waitpid()、os.wait3()或os.wait4()中的一个
至于为什么会这样,这是Unix的设计决定。子进程将它的返回值保持在它的进程状态,如果它消失了,你将没有返回值。os.wait()还将返回值返回给您,然后释放子进程并释放所有相关资源。
发布于 2013-11-27 12:35:15
我刚刚遇到了一个类似的问题:一个由spawnl
启动的进程,该进程可能会在某个特定点结束,也可能需要终止。我没有所有僵尸进程的解决方案是
def cleanup_subprocesses(self, pid):
try:
os.kill(pid, signal.SIGKILL)
except OSError:
pass
os.waitpid(self._pid, 0)
如果进程没有及时结束,它将被终止,在任何情况下,waitpid-命令都会被执行。
如果你的程序中没有好的地方,你知道你不再需要这个过程,这显然是没有帮助的。
https://stackoverflow.com/questions/18090230
复制