为什么在执行kill -9后出现幽灵进程
在我的Python脚本中,我首先通过subprocess.Popen()启动了一个子进程。然后,后来我想用kill -9 Pid
来结束这个子进程。
我发现,当我执行kill命令后,这个子进程“停止”了,因为它的图形界面窗口立刻消失了。但是,当我在kill命令后立刻执行“ps aux”命令时,结果中仍然显示着同样的进程(PID没有变)。不同的是,这个进程的命令被括号包起来了,如下所示:
root 30506 0.0 0.0 0 0 s000 Z+ 6:13PM 0:00.00 (sample process)
这让我在检测进程时遇到了麻烦,因为这个已经“死掉”的进程仍然可以通过ps命令找到。
有人知道这是为什么吗?
谢谢!
3 个回答
0
僵尸进程其实只是进程表中的一个记录。它们并不在运行,也不占用内存;这个记录之所以还在,是因为它的父进程还没有查看它的退出状态。你可以按照Gonzalo的建议进行双重分叉,或者你也可以过滤掉所有在状态列中带有Z的ps行。
0
我觉得-9这个信号让程序有机会去处理被杀掉的情况,并且可以花点时间做一些善后工作。你可以试着直接杀掉这个程序,而不发送信号。
补充:哦,其实是-15这个信号,让程序可以优雅地结束。没事的。
4
来自ps手册的内容:
Z 僵尸("zombie")进程,已经结束但其父进程没有处理。
这意味着父进程没有对已经结束的子进程使用waitpid()
来进行处理。
除了使用waitpid(),你还可以通过在执行子进程时使用双重派生的方法来避免这个问题。