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