1. 程式人生 > 實用技巧 >殭屍程序 & 孤兒程序

殭屍程序 & 孤兒程序

基本概念

殭屍程序:是所有程序都會進入的一種程序狀態,子程序退出,而父程序並沒有呼叫 wait() 或 waitpid() 獲取子程序的狀態資訊,那麼子程序的 PID 和 程序描述符 等資源仍然儲存在系統中,這種程序稱之為殭屍程序 。殭屍程序會一直以終止狀態(釋放了記憶體等資源)保持在程序表裡並會一直等待父程序獲取其退出狀態,但父程序沒有回收(父程序出了問題)。

孤兒程序:一個父程序退出,而它的一個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被 init 程序(CentOS7 中是 systemd 程序,程序號為 1)所收養,並由 init 程序對它們完成狀態收集工作 。

問題及危害

殭屍程序

如果程序不呼叫 wait()/waitpid() 的話, 那麼保留的那段資訊就不會釋放,其程序號就會一直被佔用,但是系統所能使用的程序號是有限的,如果大量的產生殭屍程序,將因為沒有可用的程序號(或者控制代碼)而導致系統不能產生新的程序, 此即為殭屍程序的危害,應當避免 。
任何一個子程序(init 除外)在 exit() 之後,都會留下一個稱為殭屍程序(Zombie)的資料結構 。

孤兒程序

孤兒程序是沒有父程序的程序,孤兒程序這個重任就落到了 init 程序(或者 systemd 程序)身上,init 程序就好像是一個民政局,專門負責處理孤兒程序的善後工作。每當出現一個孤兒程序的時候,核心就把孤 兒程序的父程序設定為 init,而 init 程序會迴圈地 wait() 它的已經退出的子程序。這樣,當一個孤兒程序淒涼地結束了其生命週期的時候,init 程序就會代表黨和政府出面處理它的一切善後工作,因此孤兒程序並不會有什麼危害。
重複強調,任何一個子程序(init 除外)在 exit() 之後,並非馬上就消失掉,而是留下一個稱為殭屍程序(Zombie)的資料結構,等待父程序處理 。

解決殭屍程序

殭屍程序的出現,追其根本原因,是其父程序出現了問題,在子程序 exit() 後沒有回收子程序的資源,而不是 Linux 系統的問題;此時執行的程式程式碼邏輯應該是有問題的,需要整改,如果出現殭屍程序,可以通過以下兩種方法解決,第一種方法一般不好用:

# 方法一,傳遞訊號給其父程序,命令其回收子程序的資源
kill -CHLD  + 父程序號

# 方法二,直接 KILL 掉其父程序,將此程序變成孤兒程序,交給 init 程序管理,init 程序回收此程序的資源
kill -9 + 父程序號