1
產生原因:
在unix 系統中,乙個程序結束了,但是他的父程序沒有等待(呼叫wait / waitpid)他,那麼他將變成乙個殭屍程序。通過ps命令檢視其帶有defunct的標誌。殭屍程序是乙個早已死亡的程序,但在程序表(processs table)中仍佔了乙個位置(slot)。
但是如果該程序的父程序已經先結束了,那麼該程序就不會變成殭屍程序。因為每個程序結束的時候,系統都會掃瞄當前系統中所執行的所有程序,看看有沒有哪個程序是剛剛結束的這個程序的子程序,如果是的話,就由init程序來接管他,成為他的父程序,從而保證每個程序都會有乙個父程序。而init程序會自動wait其子程序,因此被init接管的所有程序都不會變成殭屍程序。 2
原理分析:
每個unix程序在程序表裡都有乙個進入點(entry),核心程序執 行該程序時使用到的一切資訊都儲存在進入點。當用 ps 命令察看系統中的程序資訊時,看到的就是程序表中的相關資料。當以fork()系統呼叫建立乙個新的程序後,核心程序就會在程序表中給這個新程序分配乙個 進入點,然後將相關資訊儲存在該進入點所對應的程序表內。這些資訊中有一項是其父程序的識別碼。
子程序的結束和父程序的執行是乙個非同步過程,即父程序永遠無法**子程序到底什麼時候結束。那麼會不會因為父程序太忙來不及 wait 子程序,或者說不知道子程序什麼時候結束,而丟失子程序結束時的狀態資訊呢?不會。因為unix提供了一種機制可以保證,只要父程序想知道子程序結束時的狀態資訊,就可以得到。這種機制就是:當子程序走完了自己的生命週期後,它會執行exit()系統呼叫,核心釋放該程序所有的資源,包括開啟的檔案,占用的記憶體等。但是仍然為其保留一定的資訊(包括程序號the process id,退出碼exit code,退出狀態the terminationstatus of the process,執行時間the amount of cpu time taken by the process等),這些資料會一直保留到系統將它傳遞給它的父程序為止,直到父程序通過wait / waitpid來取時才釋放。 3
end
解決殭屍程序
linux下的殭屍程序,用kill 9 都不會消失,下面有一種辦法可以解決此問題 前些天發現有crontask程序死掉了,狀態為z,表明是殭屍程序了。通過下面的步驟可以解決它 1.用pstree命令查詢其父程序 5124 ss 0 00 crond 8884 s 0 00 crond 8893 zs...
解決殭屍程序
這幾天同事寫的程式中出現了大量的殭屍程序,幫忙分析了一下,問題出現在幾個方面 首先top命令檢視殭屍程序數目 檢視所有的殭屍程序 殺死所有殭屍程序 ps a o stat,ppid,pid,cmd grep e zz awk xargs kill 9 在程式中幾個注意的方面 1.建立子程序後,父程序...
解決Linux當中的Z(殭屍程序)
wait 等待程序 import os os.wait 放在else項,亦是父程序的函式範圍 使用二級子程序解決 父程序建立子程序,等待 子程序 子程序建立二級子程序然後退出 二級子程序稱為孤兒,和原來父程序一同執行事件 使用訊號處理,使子程序退出 import singel 子程序退出時會傳送訊號...