天天看點

如何kill殺掉linux系統中的僵屍defunct程序

在 Unix系統管理中,當用ps指令觀察程序的執行狀态時,經常看到某些程序的狀态欄為defunct,這就是所謂的“僵屍”程序。“僵屍”程序是一個早已 死亡的程序,但在程序表(processs table)中仍占了一個位置(slot)。由于程序表的容量是有限的,是以,defunct程序不僅占用系統的記憶體資源,影響系統的性能,而且如果其數 目太多,還會導緻系統癱瘓。

我們知道,每個Unix程序在程序表裡都有一個進入點(entry),核心程式執行該程序時使用到的一切資訊都存儲在進入點。當用ps指令察看系統中的程序資訊時,看到的就是程序表中的相關資料。當以fork()系統調用建立一個新的程序後,核心程序就會在程序表中給這個新程序配置設定一個進入點,然後将相關資訊存儲在該進入點所對應的程序表内。這些資訊中有一項是其父程序的識别碼。當這個程序走完了自己的生命周期後,它會執行exit()系統調用,此時原來進 程表中的資料會被該程序的退出碼(exit code)、執行時所用的CPU時間等資料所取代,這些資料會一直保留到系統将它傳遞給它的父程序為止。由此可見,defunct程序的出現時間是在子進 程終止後,但是父程序尚未讀取這些資料之前。

defunct程序是不能直接kill -9殺掉的,否則就不叫僵屍程序了。

知道了defunct程序産生的原因,就可以輕易的kill掉defunct程序。

方法有二:

1,重新開機伺服器電腦,這個是最簡單,最易用的方法,但是如果你伺服器電腦上運作有其他的程式,那麼這個方法,代價很大。

是以,盡量使用下面一種方法。

2,找到該defunct僵屍程序的父程序,将該程序的父程序殺掉,則此defunct程序将自動消失。

如何找到defunct僵屍程序的父程序?很簡單,一句指令就夠了:ps -ef | grep defunct_process_pid。