defunct进程是指出错损坏的进程,父子进程之间不会再通信。有时,它们会演变成“僵尸进程”,存留在你的系统中,直到系统重启。可以尝试 “kill -9” 命令来清除,但多数时候不管用。
什么是僵尸进程?
在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程。当用ps命令观察进程的执行状态时,看到这些进程的状态栏为defunct。僵尸进程是一个早已死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。
但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程。因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init进程来接管他,成为他的父进程,从而保证每个进程都会有一个父进程。而Init进程会自动wait其子进程,因此被Init接管的所有进程都不会变成僵尸进程。
由于defunct进程不仅占用系统的内存资源,影响系统的性能,而且如果其数目太多,还会导致系统瘫痪。所以必须要杀死这些defunct进程,你有两个选择:
1)重启你的计算机
2)继续往下读…
查看系统中是否存在defunct进程:
[root@dc test]# ps -ef | grep defunct root 5163 5158 0 15:42 pts/0 00:00:00 [logg] <defunct> root 5199 5198 0 15:42 pts/0 00:00:00 [hello] <defunct> root 5867 4490 0 16:17 pts/0 00:00:00 grep defunct [root@dc test]#
意味着存在2个defunct进程:一个logg进程,一个hello进程。这些进程之所以存在,可能是因为应用程序写得很烂或者用户做了不常见的操作。
通过命令:ps -ef 得到
UID PID PPID C STIME TTY TIME CMD
UID:用户ID
PID:进程ID
PPID:父进程ID
如果尝试使用PID杀死该僵尸进程,可能会没有效果
若要杀死该进程,应该对其父进程PPID下手,即kill -9 +PPID, 也就是使用(kill -9 5158)即可,其他僵尸进程同理。