2013-12-12 69 views
3

我有一個殭屍進程:不能清除殭屍進程的父是init

$ ps aux | grep Zl 
root  6641 122 0.0 0 0 ? Zl 08:57 371:10 [ovs_dpdk] <defunct> 

而且,其母公司看起來像init

$ pstree 
init─┬─acpid 
    ├─atd 
    ├─cron 
    ├─dbus-daemon 
    ├─dnsmasq 
    ├─6*[getty] 
    ├─irqbalance 
    ├─libvirtd───10*[{libvirtd}] 
    ├─ovs_dpdk───{ovs_dpdk}    <==== here 
    ├─rpc.idmapd 

但是,殺-9不殺他...

sudo kill -9 6641 

我在這裏難倒了,有幫助嗎?

+0

這是更適合於[unix.stackexchange](http://unix.stackexchange.com/)。但你有沒有試過'殺死-SIGKILL 6641'? – smac89

+0

-SIGKILL沒有幫助。 – jaeyong

回答

3

你不能殺死一個殭屍,因爲它已經死了。 :-)

說真的,一個殭屍進程已經退出了,所以沒有什麼可以殺死的。它在進程表中的輸入處於懸停狀態,直到創建(現在已死亡)孩子的父節點看到退出狀態。

Wikipedia (who else?) has a great discussion of this

,你可以告訴其父收穫死去的孩子刪除與SIGCHLD進程入口:

kill -s SIGCHLD PPID 

其中PPID是父進程ID。 ht the xmodulo folks

+3

真正的問題是,由於殭屍進程使用內核模塊作爲用戶,因此內核模塊中的引用計數會增加。我想要做的是卸載內核模塊,但由於ref count不是0,所以我不能這樣做。除重新啓動外,我該怎麼辦? – jaeyong

+2

好問題。 [這個鏈接](http://unix.stackexchange.com/questions/11172/how-can-i-kill-a-defunct-process-whose-parent-is-init)說'init'應該運行'等待()'定期收回殭屍。如果你的系統沒有這樣做,那麼似乎重新啓動是你唯一的選擇。 – khoxsey

1

殭屍是一個已經退出並不再運行的進程,但會一直保留在進程表中,直到它的父「wait()s」爲止,以便獲得它的退出狀態。殺死父母,或讓它等待它的孩子。

+0

,並且一旦父母死亡,init(進程1)將其作爲子進程繼承,init始終等待任何子進程退出。 – 9mjb

+4

你可以添加一個編輯而不是註釋 – randomusername

-1

我該如何殺死殭屍進程?

你不能殺殭屍,因爲他們已經死了。但是如果你有太多的殭屍,那麼殺掉父進程或重啓服務。

您可以使用從上述任何一個命令獲得的PID來殺死殭屍進程。例如殺具有PID 4104殭屍PROCES: 殺-9 4104

參考 - http://www.cyberciti.biz/tips/killing-zombie-process.html

+0

如果父進程是init進程呢? – jaeyong