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

虚拟猎枪?

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

它并没有给这个过程一个干净的机会:

  1. closures套接字连接

  2. 清理临时文件

  3. 通知它的孩子,它正在消失

  4. 重置其terminal特性等等等等。

一般情况下,发送15,然后等待一两秒钟,如果这样做不起作用,发送2,如果不起作用,发送1.如果不行,请删除二进制文件,因为程序performance不好!

不要使用kill -9。 不要拿出联合收割机来收拾花盆。

僵尸进程 (实际上现在叫做<defunct> )并不是一个真正的进程。 这只是进程表中的条目,所以父进程可以执行wait()系统调用 。

你不应该担心他们。 他们不占用任何资源,当他们的父母自己去世时,他们将会消失。

这是一个完全释放的进程,但仍然存在于进程表中。 将其与父项已经死亡但仍在执行的孤儿进程进行对比 。

这里有 一些 build议 ,摆脱他们。

已经有一个被接受的答案,但是:你可以杀死僵尸进程。 用debugging器附加到父进程并调用waitpid函数。 例如: – 假设父母的PID = 100,僵尸进程的PID = 200

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

僵尸进程没有任何资源分配给它,除了进程树中的入口。 当一个进程完成时会发生这种情况,但是父进程还没有收到它(也就是wait它)。

你可以尝试强制父母这样做,如果你想通过向父母发送一个SIGCHLD( kill -20 ),但是不能保证父母会尊重它。

你会经常看到他们很短的时间(例如,当查看过程树使用顶部) – 这是正常的; 在subprocess完成的时间片和父进程之间的时间片中,subprocess将显示为僵尸。

如果你看到僵尸进程持续存在 – 这是不正常的 – 仍然没有必要担心 – 再次,因为没有资源分配到死进程 – 这通常意味着应用程序是糟糕的编写糟糕的开发人员。

唯一一次你应该关注僵尸进程,就是当你看到很多很多的时候,例如,如果上面提到的同样蹩脚的应用程序被置于负载之下。

在我工作的地方,我们有很多蹩脚的开发人员,所以我有权处理这些问题,同时学习各种无用的东西。 事实上 – 我的团队通常会采用由蹩脚的开发人员在面试中编写的蹩脚的shell脚本 – 如果应聘者可以select脚本确实是crapy,并告诉我们为什么它很糟糕,他有一个很好的脚。

至于虚拟霰弹枪…

 $ shoot <pid>
 #!/ bin / sh的
 victim =`ps -e -o pid,ppid |  egrep“^ \ s * $ 1 \ b”|  awk'{print $ 2}'`
 victim \ _name =`ps -e -o pid,cmd |  egrep“^ \ s * $ {victim} \ b”| 头-n 1 |  awk'{print $ 2}'`
 #kill $ {victim}
回声“杀死$ {victim_name}”。

请记住:总是把它们打在头上。

僵尸进程是一个已经完成执行的进程,但仍然列在进程表中。

kill -9 [parent process_name]会把它放下来,带有极端的偏见。