defunct 进程的处理

最近在服务器上写了一段 shell 脚本,并通过 crontab 设置每半小时运行一次,按照预期,这个脚本每次运行后,进程就应该退出了。

但是通过 ps 发现,还存在着大量的进程,用 kill -9 的方式处理,结果这些进程都变成了 defunct,并且 kill -9 也不能让其消失,如:

-bash-3.2# ps -ef | grep llt_clean.sh
root 2006 2003 0 Apr04 ? 00:00:00 [llt_clean.sh] <defunct>
root 3006 3004 0 Apr03 ? 00:00:00 [llt_clean.sh] <defunct>
root 5270 5267 0 Apr04 ? 00:00:00 [llt_clean.sh] <defunct>
root 5943 5941 0 Apr03 ? 00:00:00 [llt_clean.sh] <defunct>
root 7811 7809 0 Apr03 ? 00:00:00 [llt_clean.sh] <defunct>
root 7866 7864 0 Apr04 ? 00:00:00 [llt_clean.sh] <defunct>

通过搜索发现一个说法:

第一,defunct进程产生的原因就是父进程先于子进程退出了。所以这个说法没有任何根据

第二,defunct进程已经是死掉的了。除了在kernel进程表里占用了记录以外,不占用任何系统资源

第三,即使是kernel的mail list也只是建议reboot来解决这个问题

(参:《如何杀死这些 defunct ?》7楼:http://bbs.chinaunix.net/thread-2245758-1-1.html)

结论:如果出现 defunct 进程,完全可以无视它,不然就重启好了。