虚拟猎枪?
天啊! 不不不。 不要使用kill -9。
它并没有给这个过程一个干净的机会:
closures套接字连接
清理临时文件
通知它的孩子,它正在消失
重置其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]会把它放下来,带有极端的偏见。