Linux系統中殭屍程序的產生原因及kill方法

2021-10-04 06:29:27 字數 1113 閱讀 3517

在linux系統中,當用ps命令觀察程序的執行狀態時,可以看到某些程序的狀態列為defunct,這就是所謂的「殭屍」程序;

一、如何檢視殭屍程序

使用ps -ef | grep z 命令:

或者使用top命令:

二、殭屍程序的產生原因

linux系統在程序表裡都有乙個進入點(entry),核心程式執行該程序時使用到的一切資訊都會儲存在該進入點中。當用ps命令檢視系統中的程序資訊時,看到的就是程序表中的相關資料;當以fork()系統呼叫建立乙個新的程序後,核心程序就會在程序表中給這個新的程序分配乙個進入點,然後將相關資訊儲存在該進入點所對應的程序表內。這些資訊中有一項是其父程序的識別碼。當這個程序走完了自己的生命週期後,它會執行exit()系統呼叫,此時原來進 程表中的資料會被該程序的退出碼(exit code)、執行時所用的cpu時間等資料所取代,這些資料會一直保留到系統將它傳遞給它的父程序為止(來自維基百科);

殭屍程序(zombie process)出現的時機也就是在子程序終止後,但是父程序尚未讀取這些資料之前,父程序通過wait / waitpid來取時才會將這些資料釋放掉. 但這樣就導致了乙個問題,如果程序不呼叫wait / waitpid的話,那麼保留的這些資料結構就不會釋放,其程序號也就會一直被占用;

當然,每個程序結束的時候,系統都會掃瞄當前系統中所執行的所有程序, 看有沒有哪個程序是剛剛結束的這個程序的子程序,如果是的話,就由init 來接管他,成為他的父程序……

三、如何清理掉殭屍程序,釋放記憶體空間

1、重啟伺服器,這個應該是最簡單、粗暴的方法,但是如果你伺服器上執行有其他的程式,那麼這個方法,代價會很大;

2、找到該defunct殭屍程序的父程序,將該程序的父程序kill掉,則此defunct程序將自動消失

命令:ps -ef | grep defunct_process_pid,然後執行kill -9 ppid 即可;

防止殭屍程序的產生

apue的 直接貼這裡。這段 採用了兩次fork,來避免產生殭屍程序。當乙個程序的父程序先退出,該程序就由init程序接管。init程序就成為了該程序的父程序 該程序退出時,有init來清理。所以該程序就不會成為殭屍程序了。include include include include intmai...

殭屍程序的產生原因

在linux系統中,殭屍程序是已經執行完畢,但是沒有被父程序 的子程序。判斷殭屍程序的乙個方法是使用ps命令檢視程序狀態。如果程序狀態是z,說明這是乙個殭屍程序。在多程序的程式中,父程序會啟動若干個子程序來處理任務。當子程序退出後,除了在程序表中占用的乙個程序表項,子程序所使用的資源 檔案描述符 記...

Linux下如何避免殭屍程序的產生

比如程序採用exit 退出的時候,作業系統會進行一些列的處理工作,包括關閉開啟的檔案描述符 占用的記憶體等等,但是,作業系統也會為該程序保留少量的資訊,比如程序id號等資訊,因而占用了系統的資源。在一種極端的情況下,檔殭屍程序過多的時候,占用了大量的程序id,系統將無法產生新的程序,相當於系統的資源...