首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >派生python,已不存在的子级

派生python,已不存在的子级
EN

Stack Overflow用户
提问于 2013-08-07 04:50:10
回答 2查看 4.8K关注 0票数 6

我对Python子进程有一些问题,所以我写了一个非常简单的脚本:

代码语言:javascript
运行
复制
import os
import sys
import time

pid = os.fork()
if pid:
    #parent
    time.sleep(30)
else:
    #child
    #os._exit(0)
    sys.exit()

当父进程处于休眠状态时,我启动

代码语言:javascript
运行
复制
ps fax | grep py[t]hon

我读到了下面的输出

代码语言:javascript
运行
复制
2577 ?        S      0:00 python /home/pi/python/GPIO/GPIODaemon.py restart
2583 ?        Z      0:00  \_ [python] <defunct>

使用sys.exit()os._exit(0)总会有一个僵尸进程,我不明白为什么。

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

EN

回答 2

Stack Overflow用户

发布于 2013-08-07 04:54:08

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

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

票数 11
EN

Stack Overflow用户

发布于 2013-11-27 20:35:15

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

代码语言:javascript
运行
复制
def cleanup_subprocesses(self, pid):
  try:
    os.kill(pid, signal.SIGKILL)
  except OSError:
    pass
  os.waitpid(self._pid, 0)

如果进程没有及时结束,它将被终止,在任何情况下,waitpid-命令都会被执行。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18090230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档