在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>
这里发生了什么。