⑴ 如何查找和殺掉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 系統中的僵屍進程以及明白了其產生的主要原因。同時,你也能學會如何查找僵屍僵屍進程並殺掉僵屍進程。
當然你也可以自己別寫腳本設置成定時運行任務自動來替你做這些工作。
⑵ 如何察看僵屍進程 zombie
因為沒有指出是什麼系統,我這里回答一下Linux下如何通過ps命令來查看僵屍進程:
ps的幫助文檔中有指出,僵屍進程會被標記為defunct。
Processesmarked<defunct>aredeadprocesses(so-called"zombies")thatremain
.
(8)iftheparentprocessexits.
所以通過下面命令可以查找出僵屍進程:
psaux|grepdefunct
⑶ 如何找到並終止 Linux 系統中的僵屍進程
在了解僵屍進程之前,讓我們來復習一下什麼是 Linux 進程。
簡而言之, 進程 [1] 是一個程序的運行實例。它可能運行在前端(比如有交互的進程),也可能運行在後端(比如無交互或自動運行的進程)。它可能是一個父進程(運行期間創建了其他進程),也可能是一個子進程(由其他進程所創建)。
在 Linux 系統中,除 PID 為 0 的第一個 init 進程(或 systemd )外,其餘進程都有父進程。進程也可以擁有自己的子進程。
不相信?可以試試在終端中使用 pstree 命令查看進程的樹型結構,你能看到系統各個進程的「家族樹」。
子進程死亡後,它的父進程會接收到通知去執行一些清理操作,如釋放內存之類。然而,若父進程並未察覺到子進程死亡,子進程就會進入到「<ruby style="box-sizing: border-box;">僵屍<rt style="box-sizing: border-box;">zombie</rt></ruby>」狀態。從父進程角度看,子進程仍然存在,即使子進程實際上已經死亡。這就是「<ruby style="box-sizing: border-box;">僵屍進程<rt style="box-sizing: border-box;">zombie process</rt></ruby>」(也被稱為「<ruby style="box-sizing: border-box;">已消失進程<rt style="box-sizing: border-box;">defunct process</rt></ruby>」)是如何產生並存在於系統中的。
這里有一個來自 Turnoff.us [2] 的關於僵屍進程的非常有趣的看法:
Image credit: Turnoff.us
重點要說的是,僵屍進程並沒有像它的名稱那樣看起來可怕。
但如果系統的內存已經所剩不多或者有太多的僵屍進程在吃掉內存,問題會變得糟糕。同樣,大部分 Linux 系統進程最大 PID 設置為 32768,如果過多僵屍進程導致其他重要任務沒有 PID 可用,你的系統會發生崩潰。
這是真實可能發生的,它有一定的概率,特別當存在一個編碼糟糕的程序開始大量產生僵屍進程的時候。
在這種情況下,找到並殺死僵屍進程是一個明智的做法。
Linux 系統中的進程可能處於如下狀態中的一種:
那如何查看進程和它的當前狀態呢?一個簡單的方法是在終端中使用 top 命令 [3]。
Top command show processes and their status
正如你在上面截圖中看到的,截圖中共有 250 個任務(進程),其中 1 個處在 「<ruby style="box-sizing: border-box;">運行中<rt style="box-sizing: border-box;">running</rt></ruby>」 狀態,248 個進程處於 「<ruby style="box-sizing: border-box;">休眠<rt style="box-sizing: border-box;">sleep</rt></ruby>」 狀態,還有一個處於 「<ruby style="box-sizing: border-box;">僵屍<rt style="box-sizing: border-box;">zombie</rt></ruby>」 狀態。
現在問題進入下一步,如何殺死 「僵屍」 進程?
僵屍進程已經死了,要如何才能殺死一個已經死亡的進程呢?
在僵屍電影中,你可以射擊僵屍的頭部或燒掉它們,但在這里是行不通的。你可以一把火燒了系統來殺死僵屍進程,但這並不是一個可行的方案。
一些人建議發送 SIGCHLD 給父進程,但這個信號很可能會被忽略。還有一個方法是殺死父進程來殺死僵屍進程,這聽起來很野蠻,但它卻是唯一能確保殺死僵屍進程的方法。
首先,通過在終端中 使用 ps 命令 [4] 我們列舉僵屍進程,得到它們的進程 ID:
<pre class="prettyprint linenums" style="box-sizing: border-box; overflow: hidden; font: 400 12px / 20px "courier new"; display: block; padding: 10px 15px; margin: 20px 0px; color: rgb(248, 248, 212); word-break: break-all; overflow-wrap: break-word; background: rgb(39, 40, 34); border: none; border-radius: 4px; box-shadow: rgb(57, 56, 46) 40px 0px 0px inset, rgb(70, 71, 65) 41px 0px 0px inset; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">
</pre>
ps ux 命令輸出的第 8 列顯示了進程狀態。上述命令只會列印所有處在 Z+ 狀態(表示僵屍狀態)的進程。
確認了進程 ID 後,我們可以得到它的父進程 ID:
<pre class="prettyprint linenums" style="box-sizing: border-box; overflow: hidden; font: 400 12px / 20px "courier new"; display: block; padding: 10px 15px; margin: 20px 0px; color: rgb(248, 248, 212); word-break: break-all; overflow-wrap: break-word; background: rgb(39, 40, 34); border: none; border-radius: 4px; box-shadow: rgb(57, 56, 46) 40px 0px 0px inset, rgb(70, 71, 65) 41px 0px 0px inset; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">
</pre>
你也可以將上述兩個命令結合在一起,直接得到僵屍進程的 PID 及其父進程的 PID:
<pre class="prettyprint linenums" style="box-sizing: border-box; overflow: hidden; font: 400 12px / 20px "courier new"; display: block; padding: 10px 15px; margin: 20px 0px; color: rgb(248, 248, 212); word-break: break-all; overflow-wrap: break-word; background: rgb(39, 40, 34); border: none; border-radius: 4px; box-shadow: rgb(57, 56, 46) 40px 0px 0px inset, rgb(70, 71, 65) 41px 0px 0px inset; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">
</pre>
現在你得到了父進程 ID,使用命令行和得到的 ID 號 終於可以殺死進程了 [5]:
<pre class="prettyprint linenums" style="box-sizing: border-box; overflow: hidden; font: 400 12px / 20px "courier new"; display: block; padding: 10px 15px; margin: 20px 0px; color: rgb(248, 248, 212); word-break: break-all; overflow-wrap: break-word; background: rgb(39, 40, 34); border: none; border-radius: 4px; box-shadow: rgb(57, 56, 46) 40px 0px 0px inset, rgb(70, 71, 65) 41px 0px 0px inset; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">
</pre>
Killing parent process
再次運行 ps 命令或 top 命令,你可以驗證僵屍進程是否已經被殺死。
恭喜!現在你知道怎麼清理僵屍進程了。
via: https://itsfoss.com/kill-zombie-process-linux/
⑷ ubuntu Linux怎麼解決僵屍進程
inux 允許進程查詢內核以獲得其父進程的 PID,或者其任何子進程的執行狀態。例如,進程可以創建一個子進程來執行特定的任務,然後調用諸如 wait() 這樣的一些庫函數檢查子進程是否終止。如果子進程已經終止,那麼,它的終止代號將告訴父進程這個任務是否已成功地完成。
為了遵循這些設計原則,不允許 Linux 內核在進程一終止後就丟棄包含在進程描述符欄位中的數據。只有父進程發出了與被終止的進程相關的 wait() 類系統調用之後,才允許這樣做。這就是引入僵死狀態的原因:盡管從技術上來說進程已死,但必須保存它的描述符,直到父進程得到通知。
如果一個進程已經終止,但是它的父進程尚未調用 wait() 或 waitpid() 對它進行清理,這時的進程狀態稱為僵死狀態,處於僵死狀態的進程稱為僵屍進程(zombie process)。任何進程在剛終止時都是僵屍進程,正常情況下,僵屍進程都立刻被父進程清理了
⑸ ubuntu Linux怎麼解決僵屍進程
「首先打開Ubuntu桌面 然後准備一個僵屍程序a,接著滑鼠右鍵單擊open in terminal,打開終端 輸入./a &,運行僵屍程序 輸入ps au,查找僵屍程序。凡是STAT是Z的就是僵屍程序,通過Ubuntu Dash,敲入system 單擊system monitor(系統監視器) 找到在終端帶Z的進程的pid,選中它,右鍵單擊kill,直接將其kill就行了」
⑹ 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腳本,
⑺ 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收養;而僵屍進程則是已終止的進程,其父進程不一定終止。
⑻ 在Linux系統中查看進程及殺死僵屍進程的方法
ps
命令
ps
命令就是最根本相應情況下也是相當強大地進程查看命令.運用該命令可以確定有哪些進程正在運行和運行地狀態、
進程
是否結束、進程有沒有僵死、哪些進程佔用了過多地資源等等.總之大部分信息均為可以通過執行該命令得到地.
ps
命令及其參數
ps
命令最經常使用地還是用於監控後台進程地工作情況,因為後台進程是不和屏幕鍵盤這些標准輸入/輸出設
備進行通信地,所以如果需要檢測其情況,便可以運用
ps
命令了.
該命令語法格式如下:
ps
[選項]
-e
顯示所有進程,環境變數
-f
全格式
-h
不顯示標題
-l
長格式
-w
寬輸出
a
顯示終端上地所有進程,包括其他用戶地進程
r
只顯示正在運行地進程
x
顯示沒有控制終端地進程
O[+|-]
k1
[,[+|-]
k2
[,…]]
根據
SHORT
KEYS、k1、k2
中快捷鍵指定地多級排序順序顯示進程列表.
對於
ps
地不同格式都存在著默認地順序指定.這些默認順序可以被用戶地指定所覆蓋.在這裡面“+”字元是可選地,“-”
字元是倒轉指定鍵地方向.
pids
只列出進程標識符,之間運用逗號分隔.該進程列表必須在命令行參數地最後一個選項後面緊接著給出,中間不能插入
空格.比如:ps
-f1,4,5.
以下介紹長命令行選項,這些選項都運用“--”開頭:
--sort
X[+|-]
key
[,[+|-]
key
[,…]]
從
SORT
KEYS
段中選一個多字母鍵.“+”字元是可選地,因為默認地方向就是按
數字升序或者詞典順序.比如:
ps
-jax
-sort=uid,-ppid,+pid.
--help
顯示幫助信息.
--version
顯示該命令地版本信息.
在前面地選項說明中提到了排序鍵,接下來對排序鍵作進一步說明.需要注意地是排序中運用地值是
ps
運用地內部值,並非
僅用於某些輸出格式地偽值.排序鍵列表見表
4-3.
排序鍵列表
c
cmd
可執行地簡單名稱
C
cmdline
完整命令行
f
flags
長模式標志
g
pgrp
進程地組
ID
G
tpgid
控制
tty
進程組
ID
j
cutime
累計用戶時間
J
cstime
累計系統時間
k
utime
用戶時間
K
stime
系統時間
m
min_flt
次要頁錯
查找Zombie進程
首先,當桌面程序卡死的時候,你可以嘗試進入其他tty終端。切換方式:ctrl
+
alt
+
[1,2,3,4,5,6,7],7是桌面終端
其次,你可以使用top命令查看當前是否有Zombie進程
從上圖可以看到僵屍進程數,num
zombie,num大於0,則代表系統存在僵屍進程
最後,利用ps命令查找Zombie進程
復制代碼
代碼如下:
ps
-A
-ostat,ppid,pid,cmd
|
grep
-e
'^[zZ]'
示例
:
殺死Zombie進程
直接kill
-9
Zombiepid是沒有作用的,原因是:Zombie表示進程已經退出,想要清理這樣的進程,需要清除其父進程或者等很長時間後內核將其清除
復制代碼
代碼如下:
kill
-HUP
ppid
後記
不知道為什麼我注銷之後重新登錄還有這個僵屍進程,懷疑是否是LightDM的bug,不過Ubuntu12.04
desktop
display
manager就是LightDM,所以kill
-HUP至少起到了注銷的作用,不用重啟了
⑼ 【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進程將負責清除這個孤兒進程!
⑽ 如何查看並殺死僵屍進程
僵屍進程也就是Zombie進程,在Ubuntu系統中,要如何查找和殺死僵屍進程呢?隨我一起局此來了解下吧。查找Zombie進程首先,當桌面程序卡死的時候,你可以嘗試進入其他tty終端。切換方式:ctrl + alt + [1,2,3,4,5,6,7],7是桌面終端其次,你可以使用top命令查看當前是否有Zombie進程從上圖可以看到僵屍進程數,num zombie,num大於0,則代表系統存在僵屍進程最後,利用ps命令查找Zombie進圓臘襲程ps -A -ostat,ppid,pid,cmd | grep -e 『^[zZ]』示例 :具體參數解釋可以通過man來自己學習殺死Zombie進程直接kill -9 Zombiepid是沒有作用的,原因是:Zombie表示進程已經退出,想要清理這樣的進程,需要清除其父進程或者等很長時間後內核將其清除kill -HUP ppid上面就是Ubuntu查殺僵屍進橘兄程的方法介紹了,通過本文介紹的方法就能將僵屍進程去除,及時沒有徹底清除,也不影響系統的運行。