欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

終止Linux中的defunct進(jìn)程的方法指南

黑·白   發(fā)布時(shí)間:2016-05-06 11:41:46   作者:youngsterxyf   我要評論
這篇文章主要介紹了終止Linux中的defunct進(jìn)程的方法指南,文中首先對defunct進(jìn)程的概念和運(yùn)作方式作了補(bǔ)充說明,需要的朋友可以參考下

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

為了終止這些defunct進(jìn)程,你有兩個(gè)選擇:
1.重啟你的計(jì)算機(jī)
2.繼續(xù)往下讀...
我們先看看系統(tǒng)中是否存在defunct進(jìn)程:

復(fù)制代碼
代碼如下:

$ ps -A | grep defunct

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

復(fù)制代碼
代碼如下:

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個(gè)defunct進(jìn)程:3個(gè)mono進(jìn)程,以及3個(gè)ruby進(jìn)程。這些進(jìn)程之所以存在,可能是因?yàn)閼?yīng)用程序?qū)懙煤軤€或者用戶做了不常見的操作,在我這,一定是我寫的mono C#程序存在嚴(yán)重問題 :smile: 。
現(xiàn)在,我們來看看這些進(jìn)程的ID及其父進(jìn)程ID:

復(fù)制代碼
代碼如下:

$ ps -ef | grep defunct | more

以上命令的輸出如下:

復(fù)制代碼
代碼如下:

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:進(jìn)程ID
PPID:父進(jìn)程ID
如果你使用命令 “kill -9 8328” 嘗試終止ID為8328的進(jìn)程,可能會沒效果。要想成功終止該進(jìn)程,需要對其父進(jìn)程(ID為6757)執(zhí)行kill命令($ kill -9 6757)。對所有這些進(jìn)程的父進(jìn)程ID應(yīng)用kill命令,并驗(yàn)證結(jié)果($ ps -A | grep defunct)。
如果前一個(gè)命令顯示無結(jié)果,那么搞定!否則,可能你需要重啟一下系統(tǒng)。

相關(guān)文章

最新評論