在了解Zombie進程之前,讓我回憶一下什么是進程。簡而言之,進程是程序實例。它可以是前臺的交互式進程或后臺的非交互式或自動進程。
它可以是父進程,運行時其他進程的創建者。也可以是子進程是由其它進程創建的進程。
在Linux除了第一個PID為0的init/systemd初始化進程外,其他每個進程都有一個父進程。
使用pstree
命令在終端中的查看進程樹時,也可以查看系統進程的族普。在本教程中將說明如何在Linux終止僵尸進程。
僵尸進程
當子進程死亡時,會通知父進程,以便它可以進行一些清理,例如釋放內存等。
但是存在另一種例外情況是,當子進程比父進程先結束,而父進程又沒有回收子進程,釋放子進程占用的資源。此時子進程將成為一個僵尸進程。
僵尸進程危害
實話說僵尸進程并不像它的名字聽起來那么危險。如果您的系統內存有限或者有太多僵尸進程占用內存,則可能會出現問題。
此外,現在的Linux發行版都可以將進程PID的最大值設置為32768。如果系統進程沒有可用的ID,您的系統可能會崩潰。
這種情況很少發生,但有可能發生,如果一個編碼不當的程序開始產生大量僵尸進程。在這種情況下,最好找到并終止僵尸進程。
查找僵尸進程
Linux中的進程可以是這些狀態之一,D
不間斷睡眠,I
空閑,R
正在運行,S
睡眠,T
由進程制信號終止,t
在跟蹤狀態,通常是被調試器停止。Z
僵尸進程。
在查找僵尸進程不妨是先要確認Linux系統存在多少的僵尸進程運行top命令,top命令輸出的第二行行尾包行僵尸進程的計數1 zombie
。
現在Linux系統僅僅存在一個僵尸進程,因此,我們可以不用終止它。但是當系統存在大量的僵尸進程的你可能就需要終止他們。
要找到Linux系統存在僵尸進程,最簡單方法使用ps命令列出所有進程,然后通過管道傳遞awk命令根據進程狀態過濾僵尸進程。
top
ps ux | awk '{if($8=="Z+") print}'
top - 22:34:07 up 12:11, 1 user, load average: 1.82, 1.83, 1.64
Tasks: 393 total, 1 running, 391 sleeping, 0 stopped, 1 zombie
終止僵尸進程
僵尸進程已經死了,你如何殺死一個已經死的進程。在僵尸電影中,你可以射擊僵尸的頭部或放火燒它。
但在這里不是一個很好選項。你可以燒毀你的系統來殺死僵尸進程,但這不是一個很好的解決方案。
有些人建議向父進程發送SIGCHLD信號。但它更有可能被忽視。殺死僵尸進程的另一個選擇是殺死其父進程。
這聽起來很殘酷,但這是殺死僵尸進程的唯一可靠方法。在終止僵尸進程之前。讓我們列出僵尸進程PID。這一點可以在終端運行ps命令來實現。
ps ux
命令輸出的第8列是進程的狀態。這里通過awk命令僅打印進程狀態為Z+
的進程,Z+
表示僵尸進程。
確定僵尸進程PID后,讓我們獲取其父進程PID,運行命令ps -o ppid= -p child_process_id
,child_process_id
是僵尸進程PID。
你也可以運行兩個命令的組合命令ps -A -ostat,pid,ppid | grep -e '[zZ]'
,命令將直接提供僵尸進程的PID及其父進程的PID。
ps ux | awk '{if($8=="Z+") print}'
ps -o ppid= -p child_process_id_number
ps -A -ostat,pid,ppid | grep -e '[zZ]'
Z+ 1828 1754
Z+
是子進程的狀態,1828是子進程PID,1754是父進程PID。
現在您獲得了父進程PID,最后運行命令sudo kill -9 parent_process_ID
終止進程。parent_process_ID
是父進程PID。
當終止父進程后可以再次運行命令ps ux | awk '{if($8=="Z+") print}'
,確認是否終止僵尸進程,也可以運行top命令查看僵尸進程的計數。
kill -9
ps ux | awk '{if($8=="Z+") print}'
結論
至此,你已經了解什么是僵尸進程,為什么要終止僵尸進程,如何查找僵尸進程以及終止僵尸進程。
-
Linux
+關注
關注
87文章
11345瀏覽量
210391 -
進程
+關注
關注
0文章
204瀏覽量
13995
發布評論請先 登錄
相關推薦
評論