init 不会杀死僵尸

fac*_*cha 3 linux init zombie

我的系统上有一些僵尸进程。我已经杀死了那些僵尸的父级,希望 init 会接管并释放资源(CLOSE_WAIT 中有很多套接字)。但是 init 并没有从系统中删除这些进程:

#ps ax
...
17051 ?        Zl   8498:24 [impalad] <defunct>
...

# ps -o ppid= -p 17051
    1
Run Code Online (Sandbox Code Playgroud)

有没有办法不用重启就清除僵尸?

更新:

我试过了kill -s SIGCHLD 1。它没有帮助。

Rya*_*hin 6

您不能杀死已失效的进程。用别人的话说:

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
Run Code Online (Sandbox Code Playgroud)

这家伙有一个似乎继续运行的不复存在的进程的问题。我不明白,但这是链接。在这种情况下kill -9 pid声称工作。

Zombie 进程仍然活着并且工作正常,但不能被杀死?