你真的需要關心僵尸行程嗎?
重點要說的是,僵尸行程并沒有像它的名稱那樣看起來可怕,
但如果系統的記憶體已經所剩不多或者有太多的僵尸行程在吃掉記憶體,問題會變得糟糕,同樣,大部分 Linux 系統行程最大 PID 設定為 32768,如果過多僵尸行程導致其他重要任務沒有 PID 可用,你的系統會發生崩潰,
這是真實可能發生的,它有一定的概率,特別當存在一個編碼糟糕的程式開始大量產生僵尸行程的時候,
在這種情況下,找到并殺死僵尸行程是一個明智的做法,
如何找到僵尸行程
Linux 系統中的行程可能處于如下狀態中的一種:
D= 不可中斷的休眠I= 空閑R= 運行中S= 休眠T= 被調度信號終止t= 被除錯器終止Z= 僵尸狀態
那如何查看行程和它的當前狀態呢?一個簡單的方法是在終端中使用 top 命令,

截圖中共有 250 個任務(行程),其中 1 個處在 “運行中running” 狀態,248 個行程處于 “休眠sleep” 狀態,還有一個處于 “僵尸zombie” 狀態,
現在問題進入下一步,如何殺死 “僵尸” 行程?
僵尸行程已經死了,要如何才能殺死一個已經死亡的行程呢?
一些人建議發送 SIGCHLD給父行程,但這個信號很可能會被忽略,還有一個方法是殺死父行程來殺死僵尸行程,這聽起來很野蠻,但它卻是唯一能確保殺死僵尸行程的方法,
首先,通過在終端中 使用 ps 命令我們列舉僵尸行程,得到它們的行程 ID:
ps ux | awk '{if($8=="Z") print}'
ps ux命令輸出的第 8 列顯示了行程狀態,上述命令只會列印所有處在 Z 狀態(表示僵尸狀態)的行程,
確認了行程 ID 后,我們可以得到它的父行程 ID:
ps -o ppid= -p {157910}
你也可以將上述兩個命令結合在一起,直接得到僵尸行程的 PID 及其父行程的 PID:
ps -A -ostat,pid,ppid | grep -e '[zZ]'
現在你得到了父行程 ID,使用命令列和得到的 ID 號 終于可以殺死行程了:
kill -9
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/340596.html
標籤:其他
