7

我在使用 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)总是有一个僵尸进程,我无法理解为什么。

处理我更复杂的代码时,我认为有一些资源被子进程保持锁定,但是在这个简化的代码中,子进程根本没有文件/套接字/数据库连接!为什么子进程僵尸化?

4

2 回答 2

11

要在 Unix 中清除子进程,您需要等待子进程,请检查http://docs.python上的 os.wait()、os.waitpid()、os.wait3() 或 os.wait4() 之一.org/2/library/os.html#os.wait

至于为什么会这样,这是 Unix 的设计决定。子进程将其返回值保持在其进程状态,如果它消失,您将没有返回值。os.wait() 也会返回返回值,然后释放子进程并释放所有相关资源。

于 2013-08-06T20:54:08.120 回答
0

我刚刚遇到了类似的问题:一个由 开始的进程spawnl,它可能会结束或可能需要在特定点终止。我没有所有僵尸进程的解决方案是

def cleanup_subprocesses(self, pid):
  try:
    os.kill(pid, signal.SIGKILL)
  except OSError:
    pass
  os.waitpid(self._pid, 0)

如果进程没有及时结束,它就会被杀死,无论如何,waitpid-command 都会被执行。

这显然没有帮助,如果你的程序没有好处,你知道,你不再需要这个过程。

于 2013-11-27T12:35:14.930 回答