it-swarm.cn

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

虚拟Shot弹枪?

38
jldugger

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

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

  1. 关闭插座连接

  2. 清理临时文件

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

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

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

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

17
Severe_admin

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

您不必担心它们。它们不占用任何资源,当父母在其自身去世时调用wait()时,它们将消失。

20
vartec

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

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

这是一个已完全释放的流程,但仍存在于流程表中。 将其与“孤立进程”进行对比 其父级已死但仍在执行。

这里某些建议 摆脱它们。

10
nedm

僵尸进程除了进程树中的条目外,没有分配任何资源。当进程完成后会发生这种情况,但是父进程尚未已收获它(即,在其上waited)。

您可以尝试通过发送SIGCHLD(kill -20),但不能保证父母会尊重它。

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

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

僵尸进程中唯一值得关注的是,当您看到很多僵尸进程时,例如,是否将上面提到的同一个糟糕的应用程序置于负载下。

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

8
Xerxes

至于虚拟shot弹枪...

 $射击<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 * $ {受害者}\b” |头-n 1 | awk'{print $ 2}'`
#kill $ {victim} 
 echo“已杀死$ {victim_name}。” 

切记:请始终将它们开枪射击。

0
drybjed