在我的Python脚本中,我首先通过subprocess.Popen()启动一个子进程。然后,我想通过kill -9 Pid
杀死该子进程。
我发现在执行kill之后,子进程被“停止”,因为该进程的GUI窗口立即消失。但是当我在kill之后立即执行“ps aux”时,结果中仍会显示相同的进程(具有相同的pid)。区别在于进程的命令包含在一对()中,如下所示:
root 30506 0.0 0.0 0 0 s000 Z + 6:13 PM 0:00.00(样品处理)
这会破坏我的进程检测逻辑,因为ps仍然可以找到死进程。
任何人都知道为什么会这样吗?
谢谢!
答案 0 :(得分:4)
来自ps的手册页:
Z Defunct(“zombie”)过程, 终止但未被其收获 父节点。
这意味着父母没有为死亡的孩子做waitpid()
。
除了waitpid()之外,你可以在执行孩子时使用double fork来避免这种情况。
答案 1 :(得分:0)
我认为-9信号让这个过程试图处理杀戮并花一些时间管家。你可以尝试在没有信号的情况下杀死进程。
编辑:哦,它实际上是-15信号,让进程优雅地死掉。没关系。
答案 2 :(得分:0)
僵尸进程实际上只是进程表中的一个条目。他们不跑,他们不消耗记忆;该条目只是停留,因为父级尚未检查其退出代码。 你可以像Gonzalo建议的那样做一个双叉,或者你可以过滤掉S列中带有Z的所有ps线。