CentOS殭屍進程與解決方案

來源:互聯網
上載者:User

Linux殭屍進程與解決方案

  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 amountof CPU time taken by the process等),這些資料會一直保留到系統將它傳遞給它的父進程為止,直到父進程通過wait / waitpid來取時才釋放。

  3,解決方案:

  (1) 父進程通過wait和waitpid等函數等待子進程結束,這會導致父進程掛起。

  執行wait()或waitpid()系統調用,則子進程在終止後會立即把它在進程表中的資料返回給父進程,此時系統會立即刪除該進入點。在這種情形下就不會產生defunct進程。

  (2) 如果父進程很忙,那麼可以用signal函數為SIGCHLD安裝handler。在子進程結束後,父進程會收到該訊號,可以在handler中調用wait回收。

  (3) 如果父進程不關心子進程什麼時候結束,那麼可以用signal(SIGCLD, SIG_IGN)或signal(SIGCHLD, SIG_IGN)通知核心,自己對子進程的結束不感興趣,那麼子進程結束後,核心會回收,並不再給父進程發送訊號

  (4)fork兩次,父進程fork一個子進程,然後繼續工作,子進程fork一個孫進程後退出,那麼孫進程被init接管,孫進程結束後,init會回收。不過子進程的回收還要自己做。

最近工作過程中,發現好幾台伺服器出現僵死進程()。

使用命令找出僵死進程:
ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'

命令註解:
-A 參數列出所有進程
-o 自訂輸出欄位 我們設定顯示欄位為 stat(狀態), ppid(進程父id), pid(進程id),cmd(命令)這四個參數

-C 用來指定所執行的命令名稱,你這裡也就是讓ps僅僅顯示php命令所產生的進程的資訊
ps -C java -o lstart,pid,cmd【不過貌似列印的不全~】
ps -A -o lstart,pid,args |grep java【這個可以的~】
因為狀態為 z或者Z 的進程為殭屍進程,所以我們使用grep抓取stat狀態為zZ進程
運行結果:

這裡一共出現了9個僵死進程,需要把它們都幹掉,執行命令:
kill -9 8310

這時再執行尋找僵死的進程,發現所有僵死進程都沒了.

補充:
最近又遇到了個問題,一台伺服器上產生了100多少僵死進程,而且每一僵死進程的父進程都不一樣,如果用上面的方法,一條一條的殺,那還不得累死我啊。
那麼就應該想一條簡單的命令,直接尋找僵死進程,然後將父進程殺死~

複製代碼程式碼範例:ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' |awk'{print $2}' | xargs kill -9

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.