亡靈節到來了,這就是為什麼我們想從 LxA 做這個小教程來討論 殭屍進程 以及我們如何殺死他們。 首先要說的是,殭屍進程是,正如你所知,Linux 內核有一個子系統來管理進程,並與調度程序一起創建、改變優先級、發送或從 CPU 處理流中刪除以及殺死進程。 好吧,內核的這一部分,就像其他類 Unix 系統一樣,區分進程的各種狀態......
所以我們可以發現 一個過程 它可以處於睡眠狀態(S),即睡著了。 還有處於運行狀態(R) 的進程,即當前正在運行或正在執行的進程、停止等待處理的等待進程(D)、gestopt (T) 或掛起的進程,以及殭屍進程(Z) 或已死亡的進程。 殭屍進程或失效進程是指已成功終止的進程,但由於 Linux 仍將其保存在進程表中,因此劫持了某些系統資源。 你已經知道,當一個進程終止時,它不應該停留在這種狀態,但它會完成並且內核釋放資源,以便其他進程可以使用它們,基本上它會釋放佔用的 RAM 內存......
好吧,由於這些類型的殭屍進程並不有趣,即使它們不那麼頻繁,我們也可以按照此處所示搜索並消除它們。 第一件事是查找我們的發行版中是否存在殭屍進程,為此我們可以幫助自己 像 top 或 ps 這樣的工具。 例如,以下兩個選項之一:
ps -el | grep 'Z' ps aux | grep defunct
一旦檢測到,我們就可以 殺了他 直接與:
kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk ‘{print $2}’`
儘管另一種選擇是找到父進程,因為對於 殺死殭屍進程 您必須殺死支持它的父進程,正如您可能已經推斷出的那樣:
ps -eo pid,ppid | grep <PID> kill -9 <PPID>
你將不得不替換通過您找到的殭屍進程的 ID 並殺死它,請使用父進程的 ID 替換在這個例子中,顯然。
不錯的網站!
他們總能讓我們擺脫困境。
哪裡說:
儘管另一種選擇是找到父進程,但由於要殺死殭屍進程,您必須殺死支持它的父進程,正如您可能已經推斷出的那樣:
1| ps -eo pid,ppid | grep
2|
3| 殺-9
顯然,您必須替換找到的殭屍進程的 ID,並使用 Kill 殺死它,請使用示例中替換的父進程的 ID。
您可以添加腳本:
$貓killppid.sh
#!/斌/慶典
殺死 -9 $(ps -eo pid,ppid | awk '$1=='${1}' {print $2}')
當然,這不是普通用戶每次都執行的任務。
它只對管理員有用,但以 root 身份運行它是危險的,因為它可以殺死任何系統進程。
在 man Kill 中有這樣的註釋:
注意 您的 shell(命令行解釋器)可能有內置的終止命令。 您可以
您需要運行此處描述的 /bin/kill 命令來解決衝突。
Bash 有這樣一個命令,這是 man bash 的相關部分:
殺死[-s sigspec | -n 符號 | -sigspec] [pid | 工作規範] …
殺死-l|-L [sigspec | 退出狀態]
將由sigspec或signum命名的信號發送到由pid或job-命名的進程
規格sigspec 是不區分大小寫的信號名稱,例如 SIGKILL(帶有或
沒有 SIG 前綴)或信號編號; Signum 是信號數。 如果一個
sigspec 不存在,則假定為 SIGTERM。 -l 參數列出
信號名稱。 如果在給出 -l 時提供了任何參數,則名稱
列出參數對應的信號,返回狀態為0。
-l 的 exit_status 參數是一個數字,指定信號編號或
由信號終止的進程的退出狀態。 -L 選項等效
慢到-l。 如果至少有一個信號已成功發送,kill 返回 true,或者
如果發生錯誤或遇到無效選項,則返回 false。
首先,他們解釋了 bash 如何保護進程,以避免一些問題,但我不清楚如何使腳本安全地以 root 身份運行。
我唯一能想到的就是像這樣保護它:
$貓killppid.sh
#!/斌/慶典
如果 [ $USER == "root" ]
然後 echo 不要以 root 身份運行 $0!!! 有危險!
出口
fi
殺死 -9 $(ps -eo pid,ppid | awk '$1=='${1}' {print $2}')
$
使用 bash Kill,而不是 /bin/kill
正如你所看到的,我不太精通 bash。
您知道如何編寫一個安全腳本,該腳本將以子進程的用戶身份運行,即使它是以 root 身份運行的嗎?
相當於您手動執行的操作,如下所示:
$他的;
$kill -9 $(ps -eo pid,ppid | awk '$1=='${1}' {print $2}')