Linux
init 不會殺死殭屍
我的系統上有一些殭屍程序。我已經殺死了那些殭屍的父級,希望 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
聲稱工作。