編碼的世界 / 優質文選 / 生物

Linux如何殺掉僵屍進程


2022年5月08日
-   

Linux如何殺掉僵屍進程

1. 僵屍進程定義


​ 僵屍進程是當子進程比父進程先結束,而父進程又沒有回收子進程,釋放子進程占用的資源,此時子進程將成為一個僵屍進程。如果父進程先退出 ,子進程被init接管,子進程退出後init會回收其占用的相關資源。

2. 僵屍進程危害


​ 由於子進程的結束和父進程的運行是一個異步過程,即父進程永遠無法預測子進程 到底什麼時候結束. 那麼會不會因為父進程太忙來不及wait子進程,或者說不知道 子進程什麼時候結束,而丟失子進程結束時的狀態信息呢? 不會。因為UNⅨ提供了一種機制可以保證只要父進程想知道子進程結束時的狀態信息, 就可以得到。這種機制就是: 在每個進程退出的時候,內核釋放該進程所有的資源,包括打開的文件,占用的內存等。但是仍然為其保留一定的信息(包括進程號the process ID,退出狀態the termination status of the process,運行時間the amount of CPU time taken by the process等)。直到父進程通過wait / waitpid來取時才釋放. 但這樣就導致了問題,如果進程不調用wait / waitpid的話,那麼保留的那段信息就不會釋放,其進程號就會一直被占用,但是系統所能使用的進程號是有限的,如果大量的產生僵屍進程,將因為沒有可用的進程號而導致系統不能產生新的進程. 此即為僵屍進程的危害,應當避免。

3. 如何查看自己Linux服務器的僵屍進程


在Linux操作系統中,輸入top指令就可以查看

注意看整個界面的第二行,

最後一個zombie的前面的數字就是代表僵屍進程的數量,這裏我們看到僵屍進程數量不為0,那麼我們需要來清除一下僵屍進程。

4. 先找到僵屍進程的父進程然後kill -9 殺死


接下來需要確定僵屍進程的相關信息,比如父進程ppid、僵屍進程的pid以及命令行等信息。可以執行如下命令
ps -e -o stat,ppid,pid,cmd | egrep '^[Zz]'

說明:
  • ps:ps命令用於獲取當前系統的進程信息.
  • -e:參數用於列出所有的進程
  • -o:參數用於設定輸出格式,這裏只輸出進程的stat(狀態信息)、ppid(父進程pid)、pid(當前進程的pid),cmd(即進程的可執行文件。
  • egrep:是linux下的正則表達式工具
  • 1’:這是正則表達式,表示第一個字符的位置,[Zz],表示z或者大寫的Z字母,即表示第一個字符為Z或者z開頭的進程數據,只所以這樣是因為僵屍進程的狀態信息以Z或者z字母開頭。

然後可以kill -9 父進程pid,假設父進程pid為 9635
kill -9 9635

現在大多數linux系統,也會將僵屍進程標識為defunct,所以你也可以通過如下命令來獲取僵屍進程信息。
ps -ef | grep "defunct"

一般來說先用kill命令發送強制終止的信息,結束子進程。如下圖所示,這時候子進程是沒有辦法結束的。
所以,這時候需要用kill -9來強制終止父進程。
殺死父進程之後可以再次用top命令來看
上面的方法是通過結束父進程從而結束僵屍進程,這只能算是一個比較理想的情況 ,很多時候遇到僵屍進程我們不能結束父進程,比如父進程是init進程,那一旦結束父進程,整個系統就掛掉了,這時候則可以考慮掛起子進程,這相當於“曲線救國”。一個進程一旦掛起就相當於“什麼都不做了”。可以通過執行如下命令來掛起進程。
kill -HUP 進程pid
kill -hup 2563

Zz ↩︎

熱門文章