我的系统上有一些僵尸进程。我已杀死这些僵尸进程的父进程,希望 init 能够接管并释放资源(大量套接字处于 CLOSE_WAIT 状态)。但是 init 并未从系统中删除这些进程:
#ps ax
...
17051 ? Zl 8498:24 [impalad] <defunct>
...
# ps -o ppid= -p 17051
1
有没有办法不用重启就能消灭僵尸?
更新:
我试过了kill -s SIGCHLD 1
。没用。
答案1
您无法终止已停止的进程。用其他人的话来说:
http://www.linuxquestions.org/questions/suse-opensuse-60/howto-kill-defunct-processes-574612/
您无法杀死一个已停止运行的进程(又称僵尸进程),因为它已经死了。它不占用任何资源,所以没什么大不了的,但如果您真的想让它从进程表中消失,您需要让它的父进程收割它。“pstree”应该会为您提供进程层次结构,“kill -1”有时就足以完成这项工作。
由于您的进程的父 pid 是 init (1),所以除了重新启动之外您无法执行任何操作。
https://unix.stackexchange.com/questions/11172/how-can-i-kill-a-defunct-process-whose-parent-is-init
您无法杀死(僵尸)进程,因为它已经死了。系统保留僵尸进程的唯一原因是保留退出状态以供父进程收集。如果父进程不收集退出状态,那么僵尸进程将永远存在。摆脱这些僵尸进程的唯一方法是杀死父进程。如果父进程是 init,那么您只能重新启动。
我无法测试这一点,但这个人说你可以像这样摆脱一个已停止的进程:
There is already an accepted answer, however: you CAN kill the zombie process. Attach with the debugger to the parent process and call waitpid function. E.g.: - let's assume that the parent has PID=100, the zombie process has PID=200
$ gdb -p 100
(gdb) call waitpid(200, 0, 0)
(gdb) quit
这个人遇到了一个问题,一个已停止的进程似乎还在继续运行。我不明白,但这是链接。在这种情况下,kill -9 pid
据称它可以工作。