Linux

init 不會殺死殭屍

  • February 12, 2021

我的系統上有一些殭屍程序。我已經殺死了那些殭屍的父級,希望 init 能夠接管並釋放資源(CLOSE_WAIT 中有很多套接字)。但是 init 並沒有從系統中刪除這些程序:

#ps ax
...
17051 ?        Zl   8498:24 [impalad] <defunct>
...

# ps -o ppid= -p 17051
   1

有沒有辦法在不重新啟動的情況下移除殭屍?

更新:

我試過了kill -s SIGCHLD 1。它沒有幫助。

你不能殺死一個已經失效的程序。用別人的話說:

http://www.linuxquestions.org/questions/suse-opensuse-60/howto-kill-defunct-processes-574612/

您不能殺死已失效的程序(又名殭屍),因為它已經死了。它不佔用任何資源,所以沒什麼大不了的,但如果你真的希望它從程序表中消失,你需要讓它的父程序收穫它。“pstree”應該為您提供程序層次結構,而“kill -1”有時足以完成這項工作。

因為你的程序的父 pid 是 init (1),所以除了重啟你什麼都做不了。

https://unix.stackexchange.com/questions/11172/how-can-i-kill-a-defunct-process-whose-parent-is-init

你不能殺死一個(殭屍)程序,因為它已經死了。系統保留殭屍程序的唯一原因是保留退出狀態供父程序收集。如果父程序沒有收集退出狀態,那麼殭屍程序將永遠存在。擺脫這些殭屍程序的唯一方法是殺死父程序。如果父級是 init,那麼您只能重新啟動。

我無法對此進行測試,但這個人說你可以像這樣擺脫一個已經失效的程序:

什麼是殭屍程序,如何殺死它?

There is already an accepted answer, however: you CAN kill the zombie process. Attach with the debugger to the parent process and call waitpid function. E.g.: - let's assume that the parent has PID=100, the zombie process has PID=200

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

這傢伙遇到了一個似乎繼續執行的已失效程序的問題。我不明白,但這是連結。在這種情況下kill -9 pid聲稱工作。

殭屍程序仍然活著並且工作正常,但不能被殺死?

引用自:https://serverfault.com/questions/798497