有时候kill命令在linux中似乎并不好使,在使用kill pid或者kill -9 pid之后,仍然有很多进程顽固的留存,并且显示为<defunct>进程。这些进程就成为了僵尸进程,如果用top命令看一下,顶部就显示僵尸进程的数目了。defunct进程的产生有两种可能:一种是这个程序本身就有bug,另外就是用户执行了非正常操作。这两种可能造成了某个进程被打断与父进程或/和子进程的联系,这个进程就成了僵尸。
你的系统有没有这类进程呢?首先用来分析一下:
$ ps -A | grep defunct
假定显示出来这样的结果:
8328 ? 00:00:00 mono <defunct>
25822 ? 00:00:00 ruby <defunct>
即使你再次妄图使用kill命令杀之与无形之中,仍然发现它还顽强的活着。使用pstree命令查找mono和ruby的父进程,或者如下命令列出defunct进程的父进程:
$
$ ps -ef | grep defunct | more
假定结果如下,PPID就是父进程的pid号:
UID PID PPID …
—————————————————————
kenno 8328 6757 0 Mar22 ? 00:00:00 [mono] <defunct>
kenno 18803 18320 0 Apr02 ? 00:00:00 [ruby] <defunct>
接下来就可以使用kill -9 6757来杀掉父进程,然后通过ps -A | grep defunct验证一下效果。