为什么在执行kill -9后出现幽灵进程

1 投票
3 回答
902 浏览
提问于 2025-04-15 16:35

在我的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(),你还可以通过在执行子进程时使用双重派生的方法来避免这个问题。

撰写回答