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

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


咨詢(xún)
建站咨詢(xún)
