什麼是殭屍程式以及如何處理
在UNIX系統中,一個程式結束了,但是其父程式沒有等待(呼叫wait/waitpid)它,那麼它將變成一個殭屍程式。透過PS 可以檢視其帶有defunct的標誌,殭屍程式是一個早已死亡的程式,但在程式表中仍佔據一個位置。 |
但是如果該程式的父程式已經先結束了,那麼該程式就不會變成殭屍程式。因為每個程式結束的時候,系統都會掃描當前系統中所執行的所有程式,看看有沒有哪個程式是剛剛結束的這個程式的子程式,如果是的話,就由init程式來接管他,成為他的父程式,從而保證每個程式都會有一個父程式。 而init程式會自動wait其子程式,因此被Init接管的所有程式都不會變成殭屍程式。
一個程式在呼叫exit 結束自己的生命時候,其實它沒有真正的被銷燬,而是留下一個稱為殭屍程式的資料結構(系統呼叫exit,它的作用是使程式退出,但也僅僅限於將一個正常的程式變成一個殭屍程式,並不能將其完全銷燬)。在 程式的狀態中,殭屍程式是非常特殊的一種,它已經放棄了幾乎所有的記憶體空間,沒有任何可執行程式碼,也不能被排程,僅僅在程式列表中保留一個位置,記錄在程式的退出狀態等資訊供其他程式收集,除此之外,殭屍程式不在佔有任何記憶體空間。
它需要父程式來為它收屍…如果父程式結束了,那麼init程式會自動接手這個子程式,為它收屍,它還是能被清除的,但是如果父程式是一個迴圈,不會結束,那麼子程式就會一直保持殭屍狀態,這就是為什麼系統有時候會有很多的殭屍程式;
建立程式的方式在Windows(CreateProcess)和Linux(Fork)下的差異還是有的,但是也不是完全不能統一,麻煩點的就是Windows沒有殭屍程式的概念導致程式ID不能真正區別出一個程式,比如說一個ID100的程式關閉了,然後一個新的程式啟動後ID為100,並且父子程式之間的聯絡比Linux下要弱的多。
程式之間相互獨立;要進行等待需要顯式寫程式碼。
top>> task (line)>> zombie..
把父程式殺掉,父程式死後,殭屍程式稱為“孤兒程式”,過繼給1號程式init,init始終負責清理殭屍程式,它產生的所有殭屍程式跟著消失;
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/31559985/viewspace-2723015/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux中殭屍程式是什麼意思?怎麼檢視殭屍程式?Linux
- 什麼是殭屍網路
- Linux殭屍程式處置Linux
- linux 基礎知識 什麼是殭屍程序?有什麼影響?如何解決?Linux
- 殭屍程式,孤兒程式
- fork和殭屍程式
- 什麼是殭屍網路攻擊?安全專業人員指南
- 殭屍程式和孤兒程式
- 檢視 Linux 殭屍程式Linux
- 挖礦殭屍網路蠕蟲病毒kdevtmpfsi處理過程dev
- Linux 中殭屍程式詳解Linux
- Perl程式:殭屍程式和孤兒程式
- 什麼是流處理
- 什麼是批處理
- 子程式、孤兒程式,殭屍程式, init程式
- Linux系統殭屍程式詳解Linux
- Go Exec 殭屍與孤兒程式Go
- java事件處理模型是什麼Java事件模型
- 供應鏈攻擊是什麼?應該如何處理?
- Boot Camp是什麼以及如何使用boot
- this是什麼以及如何判斷它
- JaCoCo助您毀滅線上殭屍程式碼
- Linux 效能優化之 CPU 篇 ----- 殭屍程式Linux優化
- 盤點:網際網路上無處不在的"殭屍"
- python資料處理是什麼意思Python
- 什麼是跨域,後端工程師如何處理跨域跨域後端工程師
- 什麼是代理以及它是如何工作的?
- python異常處理的流程是什麼?Python
- 系統中出現大量不可中斷程式(D)和殭屍程式(Z)怎麼辦?
- 十四、css3動畫庫的使用、css3彈性盒子、calc()、css3預處理、什麼是less以及好處是什麼。CSSS3動畫
- 什麼是低程式碼自動化以及它如何使你受益?
- Node.js 是什麼以及如何學習?Node.js
- 什麼是 IP 衝突以及如何解決?
- 什麼是IP 欺騙以及如何防範?
- 什麼是智慧合約以及如何運作?
- UNIXC002 程式資源的回收、孤兒程式和殭屍程式
- 孤兒程序和殭屍程序
- Unity 植物大戰殭屍(一)Unity