linux僵尸進(jìn)程是什么意思
Linux僵尸進(jìn)程是一個(gè)已經(jīng)終止但是其父進(jìn)程尚未對其進(jìn)行善后處理獲取終止進(jìn)程的有關(guān)信息的進(jìn)程;僵尸進(jìn)程是當(dāng)子進(jìn)程比父進(jìn)程先結(jié)束,而父進(jìn)程又沒有回收子進(jìn)程,釋放子進(jìn)程占用的資源,此時(shí)子進(jìn)程將成為一個(gè)僵尸進(jìn)程。
程序員必備接口測試調(diào)試工具:立即使用
Apipost = Postman + Swagger + Mock + Jmeter
Api設(shè)計(jì)、調(diào)試、文檔、自動化測試工具
后端、前端、測試,同時(shí)在線協(xié)作,內(nèi)容實(shí)時(shí)同步
本教程操作環(huán)境:linux7.3系統(tǒng)、Dell G3電腦。
linux僵尸進(jìn)程是什么意思
僵尸進(jìn)程是指一個(gè)已經(jīng)終止、但是其父進(jìn)程尚未對其進(jìn)行善后處理獲取終止進(jìn)程的有關(guān)信息的進(jìn)程
僵尸進(jìn)程是當(dāng)子進(jìn)程比父進(jìn)程先結(jié)束,而父進(jìn)程又沒有回收子進(jìn)程,釋放子進(jìn)程占用的資源,此時(shí)子進(jìn)程將成為一個(gè)僵尸進(jìn)程。如果父進(jìn)程先退出 ,子進(jìn)程被init接管,子進(jìn)程退出后init會回收其占用的相關(guān)資源
我們都知道進(jìn)程的工作原理。我們啟動一個(gè)程序,開始我們的任務(wù),然后等任務(wù)結(jié)束了,我們就停止這個(gè)進(jìn)程。 進(jìn)程停止后, 該進(jìn)程就會從進(jìn)程表中移除。
你可以通過 System-Monitor 查看當(dāng)前進(jìn)程。
In UNIX System terminology, a process that has terminated,but whose parent has not yet waited for it, is called a zombie. 在UNIX 系統(tǒng)中,一個(gè)進(jìn)程結(jié)束了,但是他的父進(jìn)程沒有等待(調(diào)用wait / waitpid)他, 那么他將變成一個(gè)僵尸進(jìn)程。 但是如果該進(jìn)程的父進(jìn)程已經(jīng)先結(jié)束了,那么該進(jìn)程就不會變成僵尸進(jìn)程, 因?yàn)槊總€(gè)進(jìn)程結(jié)束的時(shí)候,系統(tǒng)都會掃描當(dāng)前系統(tǒng)中所運(yùn)行的所有進(jìn)程, 看有沒有哪個(gè)進(jìn)程是剛剛結(jié)束的這個(gè)進(jìn)程的子進(jìn)程,如果是的話,就由Init 來接管他,成為他的父進(jìn)程
擴(kuò)展知識
怎么查看僵尸進(jìn)程
利用命令ps,可以看到有父進(jìn)程ID為1的進(jìn)程是孤兒進(jìn)程;s(state)狀態(tài)為Z的是僵尸進(jìn)程。
注意:孤兒進(jìn)程(orphan process)是尚未終止但已停止(相當(dāng)于前臺掛起)的進(jìn)程,但其父進(jìn)程已經(jīng)終止,由init收養(yǎng);而僵尸進(jìn)程則是已終止的進(jìn)程,其父進(jìn)程不一定終止。
怎樣來清除僵尸進(jìn)程
改寫父進(jìn)程,在子進(jìn)程死后要為它收尸。具體做法是接管SIGCHLD信號。子進(jìn)程死后, 會發(fā)送SIGCHLD信號給父進(jìn)程,父進(jìn)程收到此信號后,執(zhí)行 waitpid()函數(shù)為子進(jìn)程收尸。這是基于這樣的原理:就算父進(jìn)程沒有調(diào)用wait,內(nèi)核也會向它發(fā)送SIGCHLD消息,盡管對的默認(rèn)處理是忽略, 如果想響應(yīng)這個(gè)消息,可以設(shè)置一個(gè)處理函數(shù)。
把父進(jìn)程殺掉。父進(jìn)程死后,僵尸進(jìn)程成為"孤兒進(jìn)程",過繼給1號進(jìn)程init,init始終會負(fù)責(zé)清理僵尸進(jìn)程,關(guān)機(jī)或重啟后所有僵尸進(jìn)程都會消失。
例如,如果 PID 5878 是一個(gè)僵尸進(jìn)程,它的父進(jìn)程是 PID 4809,那么要?dú)⑺澜┦M(jìn)程 (5878),您可以結(jié)束父進(jìn)程 (4809):
$ sudo kill -9 4809 #4809 is the parent, not the zombie
登錄后復(fù)制
殺死父進(jìn)程時(shí)要非常小心,如果一個(gè)進(jìn)程的父進(jìn)程就是 PID 1 ,并且你還殺死了它,那么系統(tǒng)將直接重啟!
推薦學(xué)習(xí):Linux視頻教程
以上就是linux僵尸進(jìn)程是什么意思的詳細(xì)內(nèi)容,更多請關(guān)注其它相關(guān)文章!