中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

Linux中怎么殺死defunct進程

Linux中怎么殺死defunct進程,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比宜昌網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式宜昌網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋宜昌地區(qū)。費用合理售后完善,十多年實體公司更值得信賴。

一、什么是defunct進程(僵尸進程)
在 Linux 系統(tǒng)中,一個進程結(jié)束了,但是他的父進程沒有等待(調(diào)用wait / waitpid)他,那么他將變成一個僵尸進程。當用ps命令觀察進程的執(zhí)行狀態(tài)時,看到這些進程的狀態(tài)欄為defunct。僵尸進程是一個早已死亡的進程,但在進程表(processs table)中仍占了一個位置(slot)。
但是如果該進程的父進程已經(jīng)先結(jié)束了,那么該進程就不會變成僵尸進程。因為每個進程結(jié)束的時候,系統(tǒng)都會掃描當前系統(tǒng)中所運行的所有進程,看看有沒有哪個進程是剛剛結(jié)束的這個進程的子進程,如果是的話,就由Init進程來接管他,成為他的父進程,從而保證每個進程都會有一個父進程。而Init進程會自動wait其子進程,因此被Init接管的所有進程都不會變成僵尸進程。

二、 Linux下進程的運作方式
每個 Linux進程在進程表里都有一個進入點(entry),核心進程執(zhí)行該進程時使用到的一切信息都存儲在進入點。當用 ps 命令察看系統(tǒng)中的進程信息時,看到的就是進程表中的相關(guān)數(shù)據(jù)。當以fork()系統(tǒng)調(diào)用建立一個新的進程后,核心進程就會在進程表中給這個新進程分配一個進入點,然后將相關(guān)信息存儲在該進入點所對應(yīng)的進程表內(nèi)。這些信息中有一項是其父進程的識別碼。
子進程的結(jié)束和父進程的運行是一個異步過程,即父進程永遠無法預測子進程到底什么時候結(jié)束。那么會不會因為父進程太忙來不及 wait 子進程,或者說不知道子進程什么時候結(jié)束,而丟失子進程結(jié)束時的狀態(tài)信息呢?
不會。因為 Linux提供了一種機制可以保證,只要父進程想知道子進程結(jié)束時的狀態(tài)信息,就可以得到。這種機制就是:當子進程走完了自己的生命周期后,它會執(zhí)行exit()系統(tǒng)調(diào)用,內(nèi)核釋放該進程所有的資源,包括打開的文件,占用的內(nèi)存等。但是仍然為其保留一定的信息(包括進程號the process ID,退出碼exit code,退出狀態(tài)the terminationstatus of the process,運行時間the amount of CPU time taken by the process等),這些數(shù)據(jù)會一直保留到系統(tǒng)將它傳遞給它的父進程為止,直到父進程通過wait / waitpid來取時才釋放。
也就是說,當一個進程死亡時,它并不是完全的消失了。進程終止,它不再運行,但是還有一些殘留的數(shù)據(jù)等待父進程收回。當父進程 fork() 一個子進程后,它必須用 wait() (或者 waitpid())等待子進程退出。正是這個 wait() 動作來讓子進程的殘留數(shù)據(jù)消失。

三、僵尸進程的危害
如果父進程不調(diào)用wait / waitpid的話,那么保留的那段信息就不會釋放,其進程號就會一直被占用,但是系統(tǒng)的進程表容量是有限的,所能使用的進程號也是有限的,如果大量的產(chǎn)生僵尸進程,將因為沒有可用的進程號而導致系統(tǒng)不能產(chǎn)生新的進程。
所以,defunct進程不僅占用系統(tǒng)的內(nèi)存資源,影響系統(tǒng)的性能,而且如果其數(shù)目太多,還會導致系統(tǒng)癱瘓。而且,由于調(diào)度程序無法選中Defunct 進程,所以不能用kill命令刪除Defunct 進程,惟一的方法只有重啟系統(tǒng)。

四、如何殺死defunct進程
defunct進程是指出錯損壞的進程,父子進程之間不會再通信。有時,它們會演變成“僵尸進程”,存留在你的系統(tǒng)中,直到系統(tǒng)重啟。可以嘗試 “kill -9” 命令來清除,但多數(shù)時候不管用。
為了殺死這些defunct進程,你有兩個選擇:
1.重啟你的計算機
2.繼續(xù)往下讀...
我們先看看系統(tǒng)中是否存在defunct進程:

代碼如下:


$ ps -A | grep defunct


假設(shè)得到的輸出如下所示:

代碼如下:


8328 ? 00:00:00 mono <defunct>
8522 ? 00:00:01 mono <defunct>
13132 ? 00:00:00 mono <defunct>
25822 ? 00:00:00 ruby <defunct>
28383 ? 00:00:00 ruby <defunct>
18803 ? 00:00:00 ruby <defunct>


這意味著存在6個defunct進程:3個mono進程,以及3個ruby進程。這些進程之所以存在,可能是因為應(yīng)用程序?qū)懙煤軤€或者用戶做了不常見的操作,在我這,一定是我寫的mono C#程序存在嚴重問題 :smile: 。
現(xiàn)在,我們來看看這些進程的ID及其父進程ID:

代碼如下:


$ ps -ef | grep defunct | more


以上命令的輸出如下:

代碼如下:


UID PID PPID ...
---------------------------------------------------------------
kenno 8328 6757 0 Mar22 ? 00:00:00 [mono] <defunct>
kenno 8522 6757 0 Mar22 ? 00:00:01 [mono] <defunct>
kenno 13132 6757 0 Mar23 ? 00:00:00 [mono] <defunct>
kenno 25822 25808 0 Mar27 ? 00:00:00 [ruby] <defunct>
kenno 28383 28366 0 Mar27 ? 00:00:00 [ruby] <defunct>
kenno 18803 18320 0 Apr02 ? 00:00:00 [ruby] <defunct>


UID:用戶ID
PID:進程ID
PPID:父進程ID
如果你使用命令 “kill -9 8328” 嘗試殺死ID為8328的進程,可能會沒效果。要想成功殺死該進程,需要對其父進程(ID為6757)執(zhí)行kill命令($ kill -9 6757)。對所有這些進程的父進程ID應(yīng)用kill命令,并驗證結(jié)果($ ps -A | grep defunct)。

看完上述內(nèi)容,你們掌握Linux中怎么殺死defunct進程的方法了嗎?如果還想學到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

本文標題:Linux中怎么殺死defunct進程
網(wǎng)站鏈接:http://www.rwnh.cn/article10/pcohdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)品牌網(wǎng)站制作、網(wǎng)站內(nèi)鏈、、Google網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營
连云港市| 本溪市| 龙门县| 神木县| 罗甸县| 民和| 昔阳县| 闻喜县| 宿迁市| 莱阳市| 林周县| 德江县| 黑河市| 钦州市| 阿克| 钦州市| 新和县| 临洮县| 柯坪县| 泰安市| 托里县| 镇雄县| 杭锦旗| 新丰县| 枞阳县| 清河县| 九龙城区| 永嘉县| 龙江县| 桐乡市| 股票| 南丰县| 博乐市| 合水县| 兴海县| 桦甸市| 仁怀市| 虹口区| 洛隆县| 黔西| 政和县|