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

【Linux學(xué)習(xí)雜談】之進(jìn)程的誕生和消失
孤兒進(jìn)程和僵尸進(jìn)程
Linux下的進(jìn)程結(jié)構(gòu)
什么是僵尸進(jìn)程和孤兒進(jìn)程
為什么會(huì)出現(xiàn)LINUX僵尸進(jìn)程
Linux守護(hù)進(jìn)程詳解

僵尸進(jìn)程的產(chǎn)生介紹和危害以及解決方法

什么是僵尸進(jìn)程_Linux僵尸進(jìn)程可以被“殺死”嗎?

你知道僵尸進(jìn)程是個(gè)什么東西?
Linux 系統(tǒng)中僵尸進(jìn)程
Linux數(shù)據(jù)中心服務(wù)器上的僵尸進(jìn)程怎樣正確的處理

Linux僵尸進(jìn)程會(huì)被殺死嗎?

linux下開發(fā)避免僵尸進(jìn)程的方法

如何查看系統(tǒng)是否有僵尸進(jìn)程

評(píng)論