在UNIX系统上杀死已失效的进程

时间:2008-12-10 16:42:52

标签: unix process kill zombie-process

我的系统上有一个已解散的过程:

abc      22093 19508  0 23:29 pts/4    00:00:00 grep ProcA
abc      31756     1  0 Dec08 ?        00:00:00 [ProcA_my_collect] <defunct>

如何在不重启机器的情况下终止上述过程?我试过

kill -9 31756
sudo kill -9 31756

5 个答案:

答案 0 :(得分:41)

你已经杀死了这个进程,但是一个死进程不会从进程表中消失,直到它的父进程执行一个名为“reaping”的任务(本质上为该进程调用wait(3)来读取它的退出状态)。尚未获得的死流程称为“zombie processes。”

您在31756中看到的父进程ID是进程ID 1,它始终属于init。该过程应定期收集其僵尸进程,但如果不能,则它们将在进程表中保留僵尸,直到您重新启动。

答案 1 :(得分:23)

您是否检查过可能需要先杀死的子进程?有时堵塞就行了...... 试试ps -ef --forest

看看它下面的东西(如果有的话)然后先杀掉那个,然后你已经知道的那个

答案 2 :(得分:6)

如果kill -9无法终止进程,则原因几乎总是驱动程序或操作系统错误。

init进程已采用该进程,但无法获得它。也就是说:当init调用wait(2)时,不返回该进程。 init的主要目的之一是收获死亡的孤儿,所以问题不在于其父母在收获之前就死了。想一想:否则,谁会在注销后获得nohup'd进程的结果?

除非他们以某种方式与您所看到的特定错误相关,否则杀死已解散过程的孩子不太可能提供帮助。

答案 3 :(得分:0)

该过程可能会在例如忽略像SIGPIPE这样的信号,请查看strace -p <pid>这里发生了什么。

答案 4 :(得分:0)

如果杀死父母没有解决它,你可能无法做到。无论出于何种原因,系统都没有收集僵尸进程。

FWIW,我在SCO Openserver boxen上看到了很多我曾经管理的内容。繁重的多用户使用和低系统资源,但它似乎没有伤害任何东西。只是生我的气:)