持續存在的殭屍進程是錯誤的跡象嗎?

持續存在的殭屍進程是錯誤的跡象嗎?

(作業系統:Debian 變體。)

具有殭屍狀態的行程。屬於PPid一個gvim進程。的內容/proc/[pid]/wchando_exit, /commsh/cmdline為空,/status如下圖所示。

這可能是個錯誤嗎gvim?從維基百科條目殭屍行程我讀到一個程式可以自願拒絕調用wait,但這是針對 gvim已空閒相當長一段時間的會話的。我關閉了該gvim進程 - 但殭屍仍然潛伏在周圍。這是否表示存在作業系統錯誤?

再次來自維基百科:

如果父程式不再執行,殭屍行程通常表示作業系統中存在錯誤。

init收穫被遺棄的進程的頻率是多少?gvim距離死亡已經過去了至少 60 分鐘,但它仍然存在。

另一方面,它可能是sh又不是嗎gvim

/status 文件SigQ零狀態。

$ less /proc/30339/status
Name     : sh
State    : Z (zombie)
Tgid     : 30339
Pid      : 30339
PPid     : 29673
TracerPid:     0
Uid      :  1000    1000    1000    1000
Gid      :  1000    1000    1000    1000
FDSize   :     0
Groups   :     4 7 20 24 27 29 30 46 107 124 127 1000 
Threads  :     1
SigQ     : 0/30658
SigPnd   : 0000000000000000
ShdPnd   : 0000000000000000
SigBlk   : 0000000000000000
SigIgn   : 0000000000003001
SigCgt   : 0000000000010002
CapInh   : 0000000000000000
CapPrm   : 0000000000000000
CapEff   : 0000000000000000
CapBnd   : ffffffffffffffff
Cpus_allowed     :   3
Cpus_allowed_list:   0-1
Mems_allowed     :   1
Mems_allowed_list:   0
voluntary_ctxt_switches   :   2
nonvoluntary_ctxt_switches:   3

並不是說它破壞了我的美容覺,而是想知道…

答案1

看到殭屍往往表示產生它們的進程中存在錯誤:該進程應該收穫殭屍(透過呼叫wait)或明確忽略SIGCLD(或設定SA_NOCLDWAIT標誌)。

然而,這是一個小錯誤。殭屍行程只消耗行程表中的一個項目,這是可以忽略的資源量。只有當一個過程留下數千個殭屍時,問題才會變得嚴重。

你還沒殺死殭屍的父親行程:否則殭屍就會消失。進程 29673(殭屍進程的父進程)仍然活著並且正在運行(但沒有wait運行)。這要么不是 Gvim,而是它的某個子進程,要么您關閉了 Gvim 視窗但程式仍在運行。運行ps l 29673看看這個進程是什麼。

答案2

如果您不斷遇到殭屍進程,我傾向於認為肯定有問題。殭屍行程確實會發生。我通常每個月都會在工作和家裡維護的各種系統上看到幾次。

通常,它們可以歸因於操作員錯誤或特定軟體的問題。重新啟動通常可以解決這些問題,並且通常在一段時間內不會再次出現。

如果它們給你帶來麻煩,你可以嘗試附加到它們的父進程 ID (PPID),以gdb查看發生了什麼,甚至嘗試殺死它們:

$ gdb -p 100
(gdb) call waitpid(200, 0, 0)
(gdb) quit

如果您願意的話,我會閱讀下面的這些附加資源,以了解嘗試處理它們的其他技術。

參考

答案3

每次使用gvim都會出現這種情況嗎? gvim 除了退出後留下殭屍之外還可以工作嗎?除非它引起真正的問題,否則我會簡單地忽略它 - 殭屍不會佔用系統資源。如果這是 gvim 中的錯誤,或者可能是 gtk 中的錯誤,我不會感到驚訝,但除非該程式根本無法工作,否則我會忽略它。

當子進程在父進程開始監聽它之前退出時,通常會發生殭屍/失效進程。孩子“堅持”,因為周圍沒有程序來接收它的退出狀態,即使它確實令人滿意地終止了 - 因此它變成了殭屍。殭屍的另一個原因可能是當一個大的進程樹倒塌時 - 也許是因為有人試圖殺死樹中的一個或多個進程。

殭屍實際上是作業系統保留退出狀態和有關未正確終止的進程的其他資訊的一種方式,以防有人感興趣。除了進程表中的條目外,殭屍進程不佔用任何資源(即不佔用記憶體或 CPU)。

恕我直言,維基百科是錯誤的 - 或至少很容易誤解 - 當它聲稱未收割的殭屍意味著作業系統的錯誤,如果它們在退出產生的主進程之後徘徊。殭屍在父母死後倖存下來的情況並不罕見,在這種情況下,它會被init(PID 1)收養。 init可能最終會收穫它,但一些殭屍——甚至是那些被 init 採用的殭屍——很可能會保留到重新啟動為止。只要殭屍行程沒有太多以至於填滿了進程表,它們就幾乎不成問題。

當然,殭屍通常意味著出現了問題 - 程序產生了一個子程序,該子程序在父程序預期之前死亡 - 但問題不一定是作業系統。當然,這可能是作業系統元件造成的 - 例如。聲音伺服器遺失或配置錯誤,會導致應該為程式處理聲音的子進程立即退出,從而像殭屍一樣留下來。

答案4

一如既往 - 這取決於。如果大多數監控工具遇到超過一定數量的殭屍進程,它們就會變成黃色或紅色。

所以基本上 - 是的 - 這通常是問題的徵兆。

但我見過一些程式在其“正常”操作中產生殭屍進程。當使用“quit/exit”命令呼叫對應的頂級 api(這裡我不說父親進程)時,這些殭屍進程就消失了。

因此,在這些情況下,應用程式似乎照顧(並可能需要)這些殭屍。因此,為了進行監控,我必須在運行這些應用程式的伺服器上定義一個異常。

在其他情況下,殭屍進程會在短時間內消失 - 因此殭屍進程可能具有某些非持久性系統狀態。

在你的情況下:如果gvim完成了,應該不會剩下殭屍 - 所以可能是一個錯誤。

相關內容