我的系统上有一个已解散的过程:
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
答案 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)
如果杀死父母没有解决它,你可能无法做到。无论出于何种原因,系统都没有收集僵尸进程。
FWIW,我在SCO Openserver boxen上看到了很多我曾经管理的内容。繁重的多用户使用和低系统资源,但它似乎没有伤害任何东西。只是生我的气:)
答案 4 :(得分:0)
该过程可能会在例如忽略像SIGPIPE这样的信号,请查看strace -p <pid>
这里发生了什么。