什么是僵尸进程,如何杀死它?


Answers:


17

天啊!不不不。不要使用kill -9。

它不会给过程一个干净的机会:

  1. 关闭插座连接

  2. 清理临时文件

  3. 通知其孩子它要消失了

  4. 重置其终端特性等等。

通常,发送15,然后等待一两秒钟,如果不起作用,则发送2,如果不起作用,则发送1。如果不起作用,请删除二进制文件,因为程序的行为不当!

不要使用kill -9。不要带出联合收割机只是为了整理花盆。


13
杀死-9不会杀死僵尸。您必须杀死他们的父母,看看pstree。
LapTop006

3
@ LapTop006:在这种情况下,它们更像是吸血鬼;杀死吸血鬼头以阻止入侵。
amphetamachine

2
这个答案在几乎所有方面都是错误的。该过程完成;它已经关闭了其连接,清理了临时文件,等等。不再有实际的进程,仅是进程表中的一个条目。不要删除子二进制文件-它的行为还不错。这仅表示父母尚未为其子女举行适当的葬礼。
肯·威廉姆斯

19

僵尸进程(实际上现在称为<defunct>)不是一个进程。它仅是进程表中的条目,因此父进程可以执行wait()syscall

您不必担心它们。他们不占用任何资源,wait()当父母亲去世时,它们会消失。



9

但是,已经有一个可以接受的答案:您可以杀死僵尸进程。将调试器附加到父进程,然后调用waitpid函数。例如:-假设父级的PID = 100,僵尸进程的PID = 200

$ gdb -p 100
(gdb) call waitpid(200, 0, 0)
(gdb) quit

有趣。我会尝试的。
ewwhite 2010年

8

僵尸进程除了进程树中的条目外,没有分配任何资源。当进程完成但父进程尚未收割(即wait编辑)时,会发生这种情况。

您可以尝试通过将SIGCHLD(kill -20)发送给父级来强制父级执行此操作,但不能保证父级会尊重它。

您经常会在短时间内看到它们(例如,在使用top查看过程树时)-这是正常现象;在子进程完成到父进程轮询之间的时间片中,子进程将显示为僵尸。

但是,如果看到僵尸进程连续存在-这是不正常的-仍然无需担心-再次,因为没有资源分配给死进程-这通常意味着糟糕的开发人员编写的应用程序差强人意。

僵尸进程您唯一需要担心的是,当您看到很多僵尸进程时,例如,是否将上面提到的同一个笨拙的应用程序置于负载下。

我在工作时有很多of脚的开发人员,因此我有特权处理此类问题并在这样做的同时学习各种无用的东西。实际上-我的团队经常在面试中使用糟糕的开发人员编写的糟糕的shell脚本-如果候选人可以选择脚本确实很糟糕,并告诉我们为什么它很糟糕,那么他的脚步很好。


0

至于虚拟shot弹枪...

$ Shoot <pid>
#!/ bin / sh
受害者=`ps -e -o pid,ppid | egrep“ ^ \ s * $ 1 \ b” | awk'{print $ 2}'`
受害者\ _名称=`ps -e -o pid,cmd | egrep“ ^ \ s * $ {受害者} \ b” | 头-n 1 | awk'{print $ 2}'`
#kill $ {victim}
回显“已杀死$ {victim_name}”。

并记住:始终将它们射在头部。


抱歉,为了便于记录,此脚本有一个拼写错误“ victim_name”,并且将杀死$ 1上给定的PID的父级,无论如何考虑PID是否是唯一的僵尸或他是否有一些兄弟姐妹,它只是杀死父亲,家庭将因此灭亡。
马克·里埃拉

-1

僵尸进程是已完成执行但仍在进程表中列出的进程。

kill -9 [parent process_name]将把它放倒,带有极大的偏见。


kill -9不会杀死僵尸进程-这就是它们被称为僵尸的原因之一。僵尸“进程”将不会消失,直到其返回代码被父进程获取。

3
不,在父项上杀死-9 将杀死父项,使其成为父项,这获得孩子的返回码。
艾伦(Alan)2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.