51

我的系统上有一个已失效的进程:

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
4

5 回答 5

41

你已经杀死了进程,但是一个死进程不会从进程表中消失,直到它的父进程执行一个名为“reaping”的任务(本质上是调用wait(3)那个进程来读取它的退出状态)。没有被收割的死进程被称为“僵尸进程”。

您看到的 31756 的父进程 id 是进程 id 1,它始终属于init. 该进程应该定期获取其僵尸进程,但如果不能,它们将在进程表中保持僵尸进程,直到您重新启动。

于 2008-12-10T18:07:27.963 回答
23

您是否检查过可能需要先终止的子进程?有时,果酱已经结束了……试试ps -ef --forest

看看它下面可能有什么(如果有的话)然后先杀死那个,然后是你已经知道的那个

于 2008-12-10T17:33:33.947 回答
6

如果 kill -9 未能杀死进程,原因几乎总是驱动程序或操作系统错误。

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

杀死已失效进程的子进程不太可能有帮助,除非它们与您所看到的特定错误有关。

于 2009-03-10T12:07:31.267 回答
0

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

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

于 2008-12-10T17:19:20.620 回答
0

该过程可能会挂起,例如忽略 SIGPIPE 之类的信号,检查strace -p <pid>这里发生的情况。

于 2009-12-07T22:21:05.150 回答