Linux上的萬聖節:如何殺死殭屍進程

萬聖節郵票

亡靈節到來了,這就是為什麼我們想從 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. 負責資料:AB Internet Networks 2008 SL
  2. 數據用途:控制垃圾郵件,註釋管理。
  3. 合法性:您的同意
  4. 數據通訊:除非有法律義務,否則不會將數據傳達給第三方。
  5. 數據存儲:Occentus Networks(EU)託管的數據庫
  6. 權利:您可以隨時限制,恢復和刪除您的信息。

  1.   揉成一團 他說:

    不錯的網站!
    他們總能讓我們擺脫困境。

    哪裡說:
    儘管另一種選擇是找到父進程,但由於要殺死殭屍進程,您必須殺死支持它的父進程,正如您可能已經推斷出的那樣:

    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}')