如何正確殺死Linux中的僵尸進(jìn)程
在Linux系統(tǒng)中,僵尸進(jìn)程是一種特殊的進(jìn)程,它們已經(jīng)結(jié)束了但是仍然保留在系統(tǒng)中。僵尸進(jìn)程不會(huì)占用太多資源,但是如果數(shù)量過多,可能會(huì)導(dǎo)致系統(tǒng)資源耗盡或其他問題。本文為大家介紹如何正確殺死僵尸進(jìn)程。
1 Linux 僵尸進(jìn)程
當(dāng)子進(jìn)程完成任務(wù)后,如果其父進(jìn)程沒有及時(shí)檢查它的狀態(tài),這個(gè)子進(jìn)程就會(huì)變成一個(gè)僵尸進(jìn)程。該子進(jìn)程已經(jīng)完成了任務(wù),只是在等待其父進(jìn)程確認(rèn)。直到父進(jìn)程查看并確認(rèn)它已經(jīng)完成,這個(gè)子進(jìn)程才會(huì)被系統(tǒng)回收,否則就會(huì)保留為僵尸進(jìn)程,好像在系統(tǒng)中懸浮著。
如果想檢查系統(tǒng)中是否有僵尸進(jìn)程,可以簡單運(yùn)行命令 top,它會(huì)顯示所有正在運(yùn)行的進(jìn)程以及系統(tǒng)中的僵尸進(jìn)程(如果有的話)。
‘top’ 命令的結(jié)果
從上圖可以看到 Linux 中進(jìn)程的 PID 號(hào),也可以看到右上角,該系統(tǒng)中沒有僵尸進(jìn)程。
僵尸進(jìn)程對(duì)系統(tǒng)有害嗎?
僵尸進(jìn)程本身不會(huì)對(duì) Linux 系統(tǒng)造成傷害,但如果僵尸進(jìn)程過多,則可能導(dǎo)致一些小問題。
僵尸進(jìn)程實(shí)際上是已經(jīng)完成了任務(wù)的進(jìn)程,正在等待其父進(jìn)程清理它們,但是如果僵尸進(jìn)程的數(shù)量過多,它們可能會(huì)占滿進(jìn)程表,從而導(dǎo)致系統(tǒng)中出現(xiàn)一些小問題。
僵尸進(jìn)程已經(jīng)完成了任務(wù),它們本身不會(huì)消耗太多 CPU 或內(nèi)存資源。然而,如果經(jīng)常發(fā)生這種情況,并且系統(tǒng)中始終存在許多僵尸進(jìn)程,應(yīng)該檢查它們的父進(jìn)程,因?yàn)榭赡艽嬖趩栴},而父進(jìn)程沒有清理它們。
2 消滅僵尸進(jìn)程
想要消滅僵尸進(jìn)程,需要學(xué)習(xí)一些命令來幫助我們識(shí)別這些進(jìn)程。
首先要檢查的命令是 ps。ps 命令顯示正在 Linux 中運(yùn)行的活動(dòng)進(jìn)程。
然而,如果只運(yùn)行 ps 命令,它不會(huì)顯示太多有用的信息。因此,需要添加一些更多的標(biāo)志來獲得我們想要的信息。
ps aux
a:顯示所有用戶的進(jìn)程。u:顯示進(jìn)程的用戶/所有者。x:顯示未連接到終端的進(jìn)程。
圖片
Linux 中的進(jìn)程
如上面的結(jié)果所示,系統(tǒng)中有兩個(gè)僵尸進(jìn)程。(它們的 STAT 顯示為 Z)
由于我們目標(biāo)是查找僵尸進(jìn)程,因此需要篩選出那些狀態(tài)為 Z(即僵尸進(jìn)程)的進(jìn)程,而不是顯示所有正在運(yùn)行的進(jìn)程。這時(shí)可以使用 grep 命令來實(shí)現(xiàn)。
ps aux | grep "Z"
這會(huì)過濾系統(tǒng)中所有的僵尸進(jìn)程,除了其他進(jìn)程。
注意:如果系統(tǒng)中沒有任何僵尸進(jìn)程,而你又想繼續(xù)學(xué)習(xí)本文內(nèi)容,你可以運(yùn)行以下命令創(chuàng)建一些:
(sleep 1 & exec /bin/sleep 999) &
運(yùn)行 ps aux | grep 'Z' 命令時(shí),它會(huì)顯示所有包含字母 'Z' 的進(jìn)程,包括 grep 命令本身。這是因?yàn)?nbsp;grep 命令也是一個(gè)進(jìn)程,并且它的任務(wù)是查找包含 'Z' 的進(jìn)程,因此它也會(huì)被自己搜索到。所以,為了避免這個(gè)問題,需要添加另一個(gè)管道 | grep -v grep,這樣就可以排除掉 grep 命令自己所產(chǎn)生的進(jìn)程,只顯示真正的僵尸進(jìn)程。
現(xiàn)在要消滅僵尸進(jìn)程,需要進(jìn)行一些復(fù)雜的操作,因?yàn)椴荒苤苯託⑺澜┦M(jìn)程,而是需要首先殺死它的父進(jìn)程,然后才能殺死僵尸進(jìn)程。這是由于僵尸進(jìn)程是由其父進(jìn)程創(chuàng)建的,只有等到父進(jìn)程釋放它們的資源后,僵尸進(jìn)程才能被系統(tǒng)回收。
首先,需要找到父進(jìn)程,可以使用以下簡單的命令來實(shí)現(xiàn):
ps -o ppid= -p [僵尸進(jìn)程 PID]
(用實(shí)際的 PID 號(hào)替換僵尸進(jìn)程 PID)
這將顯示僵尸進(jìn)程的父進(jìn)程 PID,然后使用該 PID 來殺死父進(jìn)程。
在 Linux 中殺死進(jìn)程很簡單。使用 kill 命令來做到這一點(diǎn):
ps aux | grep 'Z' | grep -v grep
這將顯示任何是僵尸進(jìn)程的結(jié)果。我們獲取它們的 PID 號(hào),然后使用 ps -o ppid= -p [僵尸進(jìn)程 pid]命令來查找僵尸進(jìn)程的父進(jìn)程 PID,以便可以殺死它。
圖片
查找父進(jìn)程 PID
在例子中,有三個(gè)僵尸進(jìn)程,PID 分別是 109、117 和 119,這里找出僵尸進(jìn)程 109 的父進(jìn)程。
ps -o ppid= -p 109
結(jié)果很簡單,在例子中,只顯示 PID 號(hào):108
要?dú)⑺涝撨M(jìn)程,只需使用 kill 命令:
kill 108
至此,已經(jīng)殺死了僵尸進(jìn)程 109 的父進(jìn)程。
注意:殺死父進(jìn)程可能會(huì)對(duì)系統(tǒng)或其他應(yīng)用程序產(chǎn)生副作用,因此應(yīng)該謹(jǐn)慎執(zhí)行。通常情況下,殺死父進(jìn)程應(yīng)該作為最后的手段,在嘗試其他解決方案之前,最好先不要考慮殺死父進(jìn)程。
在例子中,殺死了我們自己創(chuàng)建的進(jìn)程,用于測(cè)試目的,所以沒問題,但是當(dāng)你真正決定殺死一個(gè)父進(jìn)程時(shí),需要你了解自己在做什么。首先,查找該父進(jìn)程,檢查它的作用和功能,然后確保通過殺死它不會(huì)破壞任何東西。最后,可以使用上文命令來殺死它。
通過閱讀本文,希望讀者能夠了解僵尸進(jìn)程并不是那么可怕,即使可能會(huì)帶來一些問題,尤其是當(dāng)僵尸進(jìn)程開始擁擠在一起時(shí);希望讀者掌握了一些武器/命令,例如使用 ps aux | grep "Z" 來查找僵尸進(jìn)程,并學(xué)會(huì)了在不破壞系統(tǒng)的情況下消滅它們及其父進(jìn)程的方法。