新聞中心
但是如果該進(jìn)程的父進(jìn)程已經(jīng)先結(jié)束了,那么該進(jìn)程就不會變成僵尸進(jìn)程。因為每個進(jìn)程結(jié)束的時候,系統(tǒng)都會掃描當(dāng)前系統(tǒng)中所運(yùn)行的所有進(jìn)程,看看有沒有哪個進(jìn)程是剛剛結(jié)束的這個進(jìn)程的子進(jìn)程,如果是的話,就由init進(jìn)程來接管他,成為他的父進(jìn)程,從而保證每個進(jìn)程都會有一個父進(jìn)程。而init進(jìn)程會自動wait其子進(jìn)程,因此被Init接管的所有進(jìn)程都不會變成僵尸進(jìn)程。

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序定制開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了海西免費(fèi)建站歡迎大家使用!
一個進(jìn)程在調(diào)用exit命令結(jié)束自己的生命時候,其實它沒有真正的被銷毀,而是留下一個稱為僵尸進(jìn)程的數(shù)據(jù)結(jié)構(gòu)(系統(tǒng)調(diào)用exit,它的作用是使進(jìn)程退出,但也僅僅限于將一個正常的進(jìn)程變成一個僵尸進(jìn)程,并不能將其完全銷毀)。在Linux進(jìn)程的狀態(tài)中,僵尸進(jìn)程是非常特殊的一種,它已經(jīng)放棄了幾乎所有的內(nèi)存空間,沒有任何可執(zhí)行代碼,也不能被調(diào)度,僅僅在進(jìn)程列表中保留一個位置,記錄在進(jìn)程的退出狀態(tài)等信息供其他進(jìn)程收集,除此之外,僵尸進(jìn)程不在占有任何內(nèi)存空間。
它需要父進(jìn)程來為它收尸…如果父進(jìn)程結(jié)束了,那么init進(jìn)程會自動接手這個子進(jìn)程,為它收尸,它還是能被清除的,但是如果父進(jìn)程是一個循環(huán),不會結(jié)束,那么子進(jìn)程就會一直保持僵尸狀態(tài),這就是為什么系統(tǒng)有時候會有很多的僵尸進(jìn)程;
為什么windows不會有僵尸進(jìn)程?
創(chuàng)建進(jìn)程的方式在Windows(CreateProcess)和Linux(Fork)下的差異還是有的,但是也不是完全不能統(tǒng)一,麻煩點(diǎn)的就是Windows沒有僵尸進(jìn)程的概念導(dǎo)致進(jìn)程ID不能真正區(qū)別出一個進(jìn)程,比如說一個ID100的進(jìn)程關(guān)閉了,然后一個新的進(jìn)程啟動后ID為100,并且父子進(jìn)程之間的聯(lián)系比Linux下要弱的多。 進(jìn)程之間相互獨(dú)立;要進(jìn)行等待需要顯式寫代碼。
查看僵尸進(jìn)程
top>> task (line)>> zombie..
清除僵尸進(jìn)程
把父進(jìn)程殺掉,父進(jìn)程死后,僵尸進(jìn)程稱為“孤兒進(jìn)程”,過繼給1號進(jìn)程init,init始終負(fù)責(zé)清理僵尸進(jìn)程,它產(chǎn)生的所有僵尸進(jìn)程跟著消失;
kill
kill命令可以帶信號號碼選項,也可以不帶。如果沒有信號號碼,kill命令就會發(fā)出終止信號(15)
killall kill -15 kill -9
一般都不能殺掉 defunct進(jìn)程.. 用了kill -15,kill -9以后 之后反而會多出更多的僵尸進(jìn)程
停止和重啟進(jìn)程
有時候只想簡單的停止和重啟進(jìn)程。如下:
kill -HUP PID
該命令讓Linux和緩的執(zhí)行進(jìn)程關(guān)閉,然后立即重啟。在配置應(yīng)用程序的時候,這個命令很方便,在對配置文件修改后需要重啟進(jìn)程時就可以執(zhí)行此命令。
很多時候,會有人建議你,如果kill殺不掉一個進(jìn)程,就用kill -9. 為什么? kill是Linux下常見的命令。其man手冊的功能定義如下:
kill – send a signal to a process
明朗了,其實kill就是給某個進(jìn)程id發(fā)送了一個信號。默認(rèn)發(fā)送的信號是SIGTERM,而kill -9發(fā)送的信號是SIGKILL,即exit。exit信號不會被系統(tǒng)阻塞,所以kill -9能順利殺掉進(jìn)程。當(dāng)然你也可以使用kill發(fā)送其他信號給進(jìn)程。
Linux系統(tǒng)尋找和殺掉僵尸進(jìn)程
Linux服務(wù)器上,多少會出現(xiàn)一些僵尸進(jìn)程,下面介紹如何快速尋找和消滅這些僵尸進(jìn)程的方法:
首先,可以使用top命令來查看服務(wù)器當(dāng)前是否有僵尸進(jìn)程,下圖中可以看到僵尸進(jìn)程的提示,如果數(shù)字大于0,那么意味著服務(wù)器當(dāng)前存在僵尸進(jìn)程:
什么是僵尸進(jìn)程以及如何處理什么是僵尸進(jìn)程以及如何處理
下面,用ps 命令和 grep命令尋找僵尸進(jìn)程:
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
命令注解: -A 參數(shù)列出所有進(jìn)程 -o 自定義輸出字段,我們設(shè)定顯示字段為stat(狀態(tài)),ppid(父進(jìn)程pid),pid(進(jìn)程pid),cmd(命令行)這四個參數(shù)
因為狀態(tài)為 z 或者 Z的進(jìn)程為僵尸進(jìn)程,所以我們使用grep 抓取stat 狀態(tài)為zZ進(jìn)程; 運(yùn)行結(jié)果如下所示:Z 12334 12339 /path/cmd 這時,我們可以使用 kill -HUP 12339 來殺掉這個僵尸進(jìn)程; 運(yùn)行后,在此運(yùn)行 ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ 來確認(rèn)是否將僵尸進(jìn)程殺死; 如果kill 子進(jìn)程的無效,可以嘗試kill 其父進(jìn)程來解決問題,例如上面父進(jìn)程pid 為12334,那么我們就運(yùn)行 kill -HUP 12334 來解決問題。
標(biāo)題名稱:講解一下Linux中的僵尸進(jìn)程以及處理方法
標(biāo)題來源:http://www.dlmjj.cn/article/dhdodjc.html


咨詢
建站咨詢
