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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM