2014-02-27 55 views
0

我有超過30個過程 '[avconv]'(我在腳本中的錯誤),根據該指令i找到這些過程:殺過程 '[avconv] <defunct>'

Ps aux | grep '\[avconv\] <defunct>' 

但我不不知道如何殺死這些進程,任何人都有想法殺死這些進程?

感謝

+0

如果你殺了父進程,他們將消失。嘗試'pstree'找出父母。 – Nazar554

+1

相關:[什麼是爲什麼它不會被殺死?](http://askubuntu.com/q/201303/3712) – jfs

回答

2

一個<defunct>過程是一個已經終止,因此不能被殺死,但其父母尚未調用wait系統調用(waitwait3wait4waitpid的一個過程,等等...)讀取其退出狀態。因此,系統會保留過程信息,以防父母最終嘗試獲取其狀態。父母讀取退出狀態時,這些過程會消失。

這些<defunct>進程也會在父進程終止時消失,因爲init進程將獲取進程的所有權並獲取(並放棄)其狀態。

您可以通過確保在發出fork調用時發出儘可能多的wait系統調用來避免<defunct>進程。或者,正如JF Sebastian指出的那樣,您還可以通過在註冊SIGCHLD信號處理程序時將SIGCHLD信號處置設置爲SIG_IGN(忽略該信號)或使用SA_NOCLDWAIT標誌來避免<defunct>進程(或者在重置默認值與SIG_DFL處置)使用sigaction。然而,在這種情況下,孩子的退出狀態將不會提供給父母 - 它只是被丟棄。

+1

+1:既精確又清楚的解釋。還有一個擴展:殭屍還可以通過配置信號來避免:'SA_NOCLDWAIT'標記或將'SIGCHLD'設置爲'SIG_IGN'。 – jfs

+0

是的,絕對......忘了那個。將增加答案,thx。 – isedev