在UNIX系统上杀死一个不存在的进程

我的系统上有一个不存在的进程:

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 

你已经杀死了这个进程,但是一个死进程不会从进程表中消失,直到它的父进程执行一个叫做“收获”的任务(实质上是调用wait(3)来让进程读取它的退出状态)。 尚未被收获的死进程被称为“ 僵尸进程” 。

你看到的31756的父进程ID是进程ID 1,它总是属于init 。 该进程应该定期收获其僵尸进程,但如果不能,它们将在进程表中保持僵尸状态,直到重新启动。

你是否检查了一个可能需要首先被杀死的subprocess? 有时候卡住了…尝试ps -ef --forest

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

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

init进程已经采用了这个进程,但是它不能收获。 也就是说:当init调用wait(2)时,这个进程没有被返回。 初始化的一个主要目的是收获死亡的孤儿,所以问题不在于其父母在收割前死亡。 想想:否则,注销后谁收获nohup'd过程的结果?

杀死已经停止的进程的孩子不可能有所帮助,除非他们与你所看到的特定错误有某种联系。

如果杀死父母并不能解决问题,你可能无法做到。 无论出于什么原因,系统都不会收集僵尸进程。

FWIW,我曾经在SCO Openserver boxen上看过很多,我曾经pipe理过。 沉重的多用户使用和低系统资源,但似乎没有任何伤害。 只是惹恼了我。 🙂

这个过程可能挂在例如忽略SIGPIPE等信号,检查strace -p <pid>这里发生了什么。