A. 如何linux的僵屍進程
在linux中,利用命令ps,可以看到有標記為Z的進程就是僵屍進程。
方法1:
ps -A -o stat,ppid,pid,cmd |grep -e "^[Zz]"
方法2:
ps -ef|grep defunc
註:S(state of the process )
O:進程正在處理器運行
S:休眠狀態(sleeping)
R:等待運行(runable)
I:空閑狀態(idle)
Z:僵屍狀態(zombie)
T:跟蹤狀態(Traced)
B:進程正在等待更多的內存頁
C:cpu利用率的估算值(cpu usage)
方法1:處理僵屍進程
kill -18 PPID###(PPID是其父進程)
這個信號是告訴父進程,該子進程已經死亡了,請收回分配給他的資源。
方法2:終止父進程
如果方法1不能終止,可採用終止其父進程的方法(如果其父進程不需要的話)父進程死後,僵屍進程成為」孤兒進程」,過繼給1號進程init,init始終會負責清理僵屍進程.它產生的所有僵屍進程也跟著消失。
先看其父進程又無其他子進程,如果有,可能需要先kill其他子進程,也就是兄弟進程。方法是:
kill –15 PID1 PID2####(PID1,PID2是僵屍進程的父進程的其它子進程)。
###然後再kill父進程:
kill –15 PPID
這樣僵屍進程就可能被完全殺掉了。
B. ubuntu Linux怎麼解決僵屍進程
首先打開Ubuntu桌面
然後准備一個僵屍程序a,如圖所示
接著滑鼠右鍵單擊open in terminal,打開終端
輸入./a &,運行僵屍程序
輸入ps au,查找僵屍程序。凡是STAT是Z的就是僵屍程序,如圖所示
通過Ubuntu Dash,敲入system
單擊system monitor(系統監視器)
找到在終端帶Z的進程的pid,選中它,右鍵單擊kill,直接將其kill就行了
C. 【zombie】如何查看並殺死僵屍進程
In UNIX System terminology, a process that has terminated,but whose parent has not yet waited for it is called a zombie.
在UNIX 系統中,一個進程結束了,但是他的父進程沒有等待(調用wait / waitpid), 那麼它將變成一個僵屍進程. 在fork()/execve()過程中,假設子進程結束時父進程仍存在,蔽皮而父進程fork()之前既沒安裝SIGCHLD信號處理函數調用 waitpid()等待子進程結束,又沒有顯式忽略該信號,則子進程成為僵屍進程。
我們可以用top命令來查看伺服器當前是否有僵屍進程,在下圖中可以看到僵屍進程數的提示,如果數字大於0,那麼意味著伺服器當前存在有僵屍進程:
#ps -ef | grep defunct
#ps -ef | grep defunct | grep -v grep | wc -l
# ps -ef | grep defunct | grep -v grep | awk '{print "kill -18 " $3}'
一般僵屍進程很難直接kill掉,不過您可以kill僵屍爸爸。父進程死後,僵屍進程成為」孤兒進程」,過繼給1號進程init,init始終會負責清理僵屍進程.它產生的所有僵屍進程也跟著消失。
子進程死後,會發送SIGCHLD信號給父進程,父進程收到此信號後,執行waitpid()函數為子進程收屍。就是基於這樣的原理:就算父進程沒有調用wait,內核也會向它發送SIGCHLD消息,而此時,盡管對它的默認處理是忽略,如果想響應這個消息,可以設置一個處理函數。
我們用ps和grep命令尋找僵屍進程:
# ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
命令註解:
-A 參數列出所有進程
-o 自定義輸出欄位 我們設定顯示欄位為 stat(狀態), ppid(進程父id), pid(進程id),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
一條簡單的命令,直接查找僵死進程,然後將父進程殺死
# ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9
# ps -e -o ppid,stat | grep Z | cut -d」 」 -f2 | xargs kill -9
# kill -HUP $(ps -A -ostat,ppid | grep -e 』^[Zz]『 | awk 』{print $2}』)
處理SIGCHLD信號並不是必須的,但對於某些進程,特別是伺服器進程往往在請求到來時生成子進程處理請求。
如果父進程不等待子進程結束,子進程將成為僵屍進程(zombie)從而佔用系統資源。如果父進程等待子進程結束,將增加父進程的負擔,影響伺服器進程的並發性能。
在Linux下 可以簡單地將 SIGCHLD信號的操作設為SIG_IGN。
這樣,內核在子進程結束時不會產生僵屍進程。這一點與BSD4不同,BSD4下必須顯式等待子進程結束才能釋放僵屍進程。
或者用兩次fork(),而且使緊跟的子進程直接退出,是的孫子進程成為孤兒進程,從而init進程將負責清除這個孤兒進程!
D. ubuntu Linux怎麼解決僵屍進程
如何查看linux系統上的僵屍進程,如何統計有多少僵屍進程?
#ps -ef | grep defunct
或者查找狀態為Z的進程,Z就是代表zombie process,僵屍進程的意思。
另外使用top命令查看時有一欄為S,如果狀態為Z說明它就是僵屍進程。
Tasks: 95 total, 1 running, 94 sleeping, 0 stopped, 0 zombie
top命令中也統計了僵屍進程。或者使用下面的命令:
ps -ef | grep defunct | grep -v grep | wc -l
如何殺死僵屍進程呢?
一般僵屍進程很難直接kill掉,不過您可以kill僵屍爸爸。父進程死後,僵屍進程成為」孤兒進程」,過繼給1號進程init,init始終會負責清理僵屍進程.它產生的所有僵屍進程也跟著消失。
ps -e -o ppid,stat | grep Z | cut -d」 」 -f2 | xargs kill -9
或
kill -HUP `ps -A -ostat,ppid | grep -e 』^[Zz]『 | awk 』{print $2}』`
當然您可以自己編寫更好的shell腳本,
E. 如何查找和殺掉Linux中的僵屍進程
Linux 系統中,進程就是一個程序的運行實例。它可能運行在前端(比如有交互的進程),也可能運行在後端(比如無交互或自動運行的進程)。它可能是一個父進程(運行期間創建了其他進程),也可能是一個子進程(由其他進程所創建)。
在 Linux 系統中,除 PID 為 0 的第一個 init 進程(或 systemd )外,其餘進程都有父進程。進程也可以擁有自己的子進程。
你可以通過使用 pstree 命令 來查看進程的樹型結構,你可以清晰的看到各個進程的「家族樹」。
在 Linux 系統中,正常情況下,子進程死亡後其父進程會接收到通知進行一些例如釋放內存之類的清理操作。但是,如果父進程未收到通知察覺子進程死亡,那麼子進程就進入了「僵死」狀態。
這就是僵死進程產生的原因。
僵屍進程並不可怕,少量的僵屍進程對系統影響並不大。但如果系統的內存已經所剩不多或者有太多的僵屍進程在耗掉內存,問題會變得糟糕。
同樣,大部分 Linux 系統進程最大 PID 設置為 32768,如果過多僵屍進程導致其他重要任務沒有 PID 可用,那麼你的系統會發生崩潰。
特別當存在一個編碼糟糕的程序開始大量產生僵屍進程的時候,這種情況經常發生。在這種情況下,我們就需要找到並殺死僵屍進程。
在linux系統中,進程有如下幾種狀態,它們隨時可能處於以上狀態中的一種:
我們可以在命令終端中通過 top命令 來查看系統進程和它的當前狀態。
命令如下:
如上面截圖中看到的,其中共有 250 個任務(進程),其中 1 個處在 「運行中running」 狀態,248 個進程處於 「休眠sleep」 狀態,還有一個處於 「僵屍zombie」 狀態。
現在問題進入下一步,如何殺死 「僵屍」 進程?
僵屍進程對系統來說就是已經死亡的進程,那麼如何殺掉一個已經死亡的進程呢?
方法很簡單,我們只需要通過如下ps命令就可以列舉僵屍進程,得到它們的進程 ID。
ps ux 命令輸出的第 8 列顯示了進程狀態。上述命令將會列印所有處在 Z+ 狀態(表示僵屍狀態)的進程。
確認了進程 ID 後,我們可以得到它的父進程 ID:
你也可以將上述兩個命令結合在一起,直接得到僵屍進程的 PID 及其父進程的 PID:
通過以上命令都可以找到僵屍進程,然後你就可以通過 kill命 令殺掉了。
或者通過如下命令查看僵屍進程:
該命令輸出結果上你可以直接看出其父進程ID,這時候你直接使用kill命令殺掉即可。
再次運行 ps 命令或 top 命令,你可以驗證僵屍進程是否已經被殺死。
通過本文你將認識 Linux 系統中的僵屍進程以及明白了其產生的主要原因。同時,你也能學會如何查找僵屍僵屍進程並殺掉僵屍進程。
當然你也可以自己別寫腳本設置成定時運行任務自動來替你做這些工作。
F. Linux裡面什麼是僵屍進程
僵屍進程是當子進程比父進程先結束,而父進程又沒有回收子進程,釋放手鄭行子進程佔用的資源,此時子進程都將成為一個僵屍進程。如果父進程先退出,子進程被init接管,子叢孫進程退出後init會收回其佔用的相關資源。
我們都知道進程的工作原畢嘩理。我們啟動一個程序,開始我們的任務,然後等任務結束了,我們就停止這個進程。進程停止後,該進程就會從進程表中移除。
你可以通過System-Monitor查看當前進程。
In UNIX System terminology, a process that has terminated,but whose parent
has not yet waited for it, is called a
zombie.在Unix系統中,一個進程結束了,但是它的父進程沒有等待它,那麼它將變成一個僵屍進程。但是如果該進程的父進程已經先結束了,那麼該進程就不會變僵屍進程,因為每個進程結束的時候,系統都會掃描當前系統中所運行的所有進程,看有沒有哪個進程是剛剛結束的這個進程的子進程,如果是的話,就由init來接管他,成為他的父進程。
怎麼查看僵屍進程?
利用命令ps,可以看到有父進程ID為1的進程是孤兒進程;s狀態為z的是僵屍進程。
注意:孤兒進程是尚未終止但已停止的進程,但其父進程已經終止,由init收養;而僵屍進程則是已終止的進程,其父進程不一定終止。
G. ubuntu Linux怎麼解決僵屍進程
inux 允許進程查詢內核以獲得其父進程的 PID,或者其任何子進程的執行狀態。例如,進程可以創建一個子進程來執行特定的任務,然後調用諸如 wait() 這樣的一些庫函數檢查子進程是否終止。如果子進程已經終止,那麼,它的終止代號將告訴父進程這個任務是否已成功地完成。
為了遵循這些設計原則,不允許 Linux 內核在進程一終止後就丟棄包含在進程描述符欄位中的數據。只有父進程發出了與被終止的進程相關的 wait() 類系統調用之後,才允許這樣做。這就是引入僵死狀態的原因:盡管從技術上來說進程已死,但必須保存它的描述符,直到父進程得到通知。
如果一個進程已經終止,但是它的父進程尚未調用 wait() 或 waitpid() 對它進行清理,這時的進程狀態稱為僵死狀態,處於僵死狀態的進程稱為僵屍進程(zombie process)。任何進程在剛終止時都是僵屍進程,正常情況下,僵屍進程都立刻被父進程清理了