摘要:這裡有一些在 Linux 上查找和殺死殭屍進程的簡單技巧。您還將學習一兩個關於進程和殭屍進程的知識。
在了解殭屍進程之前,讓我們提醒您什麼是 Linux 進程。
簡而言之, 處理 從性能的角度來看,它是程序的運行實例。它可以在前台(交互式進程)或後台(非交互式或自動化進程)。它可以是父進程(運行時另一個進程的創建者)或子進程(由另一個進程創建的進程)。
在 Linux 上,除了第一個 PID 為 0 的 init(或 systemd)進程外,其他所有進程都有一個父進程。該進程也有自己的子進程。
不相信我?利用 pstree
終端視圖進程樹命令用於顯示系統進程的“家族樹”。
什麼是 Linux 殭屍進程?
當子進程終止時,通知父進程執行清理,例如釋放內存。但是,如果父進程不知道自己的死亡,子進程將處於殭屍狀態。對於父進程,子進程仍然存在,但子進程實際上已經停止了。這就是殭屍進程(也稱為死進程)被創建並留在系統中的方式。
這是來自 Turnoff.us 的殭屍進程的一個非常有趣的視圖。
圖片來源: 關閉.us
你真的需要擔心殭屍進程嗎?
重要的是要說殭屍進程並不像它的名字所暗示的那樣危險。
如果您的系統內存有限或過多的殭屍進程正在使用內存,則可能會出現問題。此外,大多數 Linux 進程的最大 PID 為 32768。如果沒有 ID 可用於其他生產任務,系統可能會崩潰。
這種情況很少發生,但可能會發生,尤其是當一個編碼不佳的程序開始觸發許多殭屍進程時。
在這種情況下,最好找到並殺死殭屍進程。
如何找到殭屍進程?
Linux 進程可以處於以下狀態之一:
- D = 不間斷睡眠
- 我 = 免費
- R = 執行
- S = 睡眠
- T = 由作業控制信號停止
- t = 在跟踪期間被調試器停止
- Z = 殭屍
但是我在哪裡可以看到進程及其狀態?一個簡單的方法是使用終端 頂級命令..
top 命令顯示進程及其狀態
如上圖所示,共有 250 個任務(或進程),1 個正在運行,248 個進程處於休眠狀態,1 個殭屍。
現在的問題是如何殺死殭屍進程?
如何找到並殺死殭屍進程?你能殺死殭屍進程嗎?
殭屍進程已死。你如何殺死死進程?
在殭屍電影中,你在腦海中射擊並燒毀殭屍。這不是一個選項。您可以燒毀系統並殺死殭屍進程,但這不是一個可行的解決方案;)
有些人建議向父進程發送 SIGCHLD 信號。但是,它更有可能被忽略。殺死殭屍進程的另一個選擇是殺死它的父進程。聽起來很殘忍,但這是殺死殭屍進程的唯一可靠方法。
所以首先,讓我們列出殭屍進程並驗證它們的身份。可以通過 使用 ps 命令 在這樣的終端。
ps ux | awk '{if($8=="Z+") print}'
ps ux 命令輸出的第 8 列顯示了進程的狀態。我們要求您打印所有進程狀態為 Z +(表示殭屍狀態)的匹配行。
確定了進程ID之後,我們來獲取父進程ID。
ps -o ppid= -p <child_id>
或者,您可以直接結合以上兩個命令提供殭屍進程的 PID 及其父 PID,如下所示:
ps -A -ostat,pid,ppid | grep -e '[zZ]'
現在我們得到了父進程 ID,我們最終通過在命令行中輸入我們之前獲得的相應 ID 進程來終止該進程。
kill -9 <parent_process_ID>
殺死父進程
您可以通過再次運行 ps 或 top 命令來確認殭屍進程已被殺死。
恭喜!現在您知道如何消除殭屍進程了。
來自 Abhishek Prakash 的貢獻。