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