如何杀死defunct进程

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)即可,其他僵尸进程同理。

原文地址:https://www.cnblogs.com/porkerface/p/11395167.html