linux僵尸進程是一個已經終止但是其父進程尚未對其進行善后處理獲取終止進程的有關信息的進程;僵尸進程是當子進程比父進程先結束,而父進程又沒有回收子進程,釋放子進程占用的資源,此時子進程將成為一個僵尸進程。
本教程操作環境:linux7.3系統、Dell G3電腦。
linux僵尸進程是什么意思
僵尸進程是指一個已經終止、但是其父進程尚未對其進行善后處理獲取終止進程的有關信息的進程
僵尸進程是當子進程比父進程先結束,而父進程又沒有回收子進程,釋放子進程占用的資源,此時子進程將成為一個僵尸進程。如果父進程先退出 ,子進程被init接管,子進程退出后init會回收其占用的相關資源
我們都知道進程的工作原理。我們啟動一個程序,開始我們的任務,然后等任務結束了,我們就停止這個進程。 進程停止后, 該進程就會從進程表中移除。
你可以通過 System-Monitor 查看當前進程。
In UNIX System terminology, a process that has terminated,but whose parent has not yet waited for it, is called a zombie. 在UNIX 系統中,一個進程結束了,但是他的父進程沒有等待(調用wait / waitpid)他, 那么他將變成一個僵尸進程。 但是如果該進程的父進程已經先結束了,那么該進程就不會變成僵尸進程, 因為每個進程結束的時候,系統都會掃描當前系統中所運行的所有進程, 看有沒有哪個進程是剛剛結束的這個進程的子進程,如果是的話,就由Init 來接管他,成為他的父進程
擴展知識
怎么查看僵尸進程
利用命令ps,可以看到有父進程ID為1的進程是孤兒進程;s(state)狀態為Z的是僵尸進程。
注意:孤兒進程(orphan process)是尚未終止但已停止(相當于前臺掛起)的進程,但其父進程已經終止,由init收養;而僵尸進程則是已終止的進程,其父進程不一定終止。
怎樣來清除僵尸進程
改寫父進程,在子進程死后要為它收尸。具體做法是接管SIGCHLD信號。子進程死后, 會發送SIGCHLD信號給父進程,父進程收到此信號后,執行 waitpid()函數為子進程收尸。這是基于這樣的原理:就算父進程沒有調用wait,內核也會向它發送SIGCHLD消息,盡管對的默認處理是忽略, 如果想響應這個消息,可以設置一個處理函數。
把父進程殺掉。父進程死后,僵尸進程成為”孤兒進程”,過繼給1號進程init,init始終會負責清理僵尸進程,關機或重啟后所有僵尸進程都會消失。
例如,如果 PID 5878 是一個僵尸進程,它的父進程是 PID 4809,那么要殺死僵尸進程 (5878),您可以結束父進程 (4809):
$?sudo?kill?-9?4809??#4809?is?the?parent,?not?the?zombie
殺死父進程時要非常小心,如果一個進程的父進程就是 PID 1 ,并且你還殺死了它,那么系統將直接重啟!
推薦學習:Linux視頻教程