什麼是殭屍程式以及如何處理

安全劍客發表於2020-09-21
導讀 在UNIX系統中,一個程式結束了,但是其父程式沒有等待(呼叫wait/waitpid)它,那麼它將變成一個殭屍程式。透過PS 可以檢視其帶有defunct的標誌,殭屍程式是一個早已死亡的程式,但在程式表中仍佔據一個位置。

但是如果該程式的父程式已經先結束了,那麼該程式就不會變成殭屍程式。因為每個程式結束的時候,系統都會掃描當前系統中所執行的所有程式,看看有沒有哪個程式是剛剛結束的這個程式的子程式,如果是的話,就由init程式來接管他,成為他的父程式,從而保證每個程式都會有一個父程式。 而init程式會自動wait其子程式,因此被Init接管的所有程式都不會變成殭屍程式

一個程式在呼叫exit 結束自己的生命時候,其實它沒有真正的被銷燬,而是留下一個稱為殭屍程式的資料結構(系統呼叫exit,它的作用是使程式退出,但也僅僅限於將一個正常的程式變成一個殭屍程式,並不能將其完全銷燬)。在 程式的狀態中,殭屍程式是非常特殊的一種,它已經放棄了幾乎所有的記憶體空間,沒有任何可執行程式碼,也不能被排程,僅僅在程式列表中保留一個位置,記錄在程式的退出狀態等資訊供其他程式收集,除此之外,殭屍程式不在佔有任何記憶體空間。

它需要父程式來為它收屍…如果父程式結束了,那麼init程式會自動接手這個子程式,為它收屍,它還是能被清除的,但是如果父程式是一個迴圈,不會結束,那麼子程式就會一直保持殭屍狀態,這就是為什麼系統有時候會有很多的殭屍程式;

為什麼windows不會有殭屍程式?

建立程式的方式在Windows(CreateProcess)和Linux(Fork)下的差異還是有的,但是也不是完全不能統一,麻煩點的就是Windows沒有殭屍程式的概念導致程式ID不能真正區別出一個程式,比如說一個ID100的程式關閉了,然後一個新的程式啟動後ID為100,並且父子程式之間的聯絡比Linux下要弱的多。
程式之間相互獨立;要進行等待需要顯式寫程式碼。

檢視殭屍程式

top>> task (line)>> zombie..
清除殭屍程式

把父程式殺掉,父程式死後,殭屍程式稱為“孤兒程式”,過繼給1號程式init,init始終負責清理殭屍程式,它產生的所有殭屍程式跟著消失;

kill

kill命令可以帶訊號號碼選項,也可以不帶。如果沒有訊號號碼,kill命令就會發出終止訊號(15)

killall   kill -15  kill -9

一般都不能殺掉 defunct程式.. 用了kill -15,kill -9以後 之後反而會多出更多的殭屍程式

停止和重啟程式

有時候只想簡單的停止和重啟程式。如下:

kill -HUP PID

該命令讓Linux和緩的執行程式關閉,然後立即重啟。在配置應用程式的時候,這個命令很方便,在對配置檔案修改後需要重啟程式時就可以執行此命令。

很多時候,會有人建議你,如果kill殺不掉一個程式,就用kill -9. 為什麼?
kill是Linux下常見的命令。其man手冊的功能定義如下:

kill – send a signal to a process

明朗了,其實kill就是給某個程式id傳送了一個訊號。預設傳送的訊號是SIGTERM,而kill -9傳送的訊號是SIGKILL,即exit。exit訊號不會被系統阻塞,所以kill -9能順利殺掉程式。當然你也可以使用kill傳送其他訊號給程式。

尋找和殺掉殭屍程式

Linux伺服器上,多少會出現一些殭屍程式,下面介紹如何快速尋找和消滅這些殭屍程式的方法:

首先,可以使用top命令來檢視伺服器當前是否有殭屍程式,下圖中可以看到殭屍程式的提示,如果數字大於0,那麼意味著伺服器當前存在殭屍程式:

什麼是殭屍程式以及如何處理什麼是殭屍程式以及如何處理

下面,用ps 命令和 grep命令尋找殭屍程式:

ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'

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

因為狀態為 z 或者 Z的程式為殭屍程式,所以我們使用grep 抓取stat 狀態為zZ程式;
執行結果如下所示: Z 12334 12339 /path/cmd
這時,我們可以使用  kill -HUP 12339  來殺掉這個殭屍程式;
執行後,在此執行  ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'  來確認是否將殭屍程式殺死;
如果kill 子程式的無效,可以嘗試kill 其父程式來解決問題,例如上面父程式pid 為12334,那麼我們就執行   kill -HUP 12334 來解決問題。

原文來自:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2723003/,如需轉載,請註明出處,否則將追究法律責任。

相關文章