Linux
如何用父 1 殺死 <defunct> 程序
我在 RedHat 盒子上執行 Bacula。儲存守護程序 bacula-sd 有時會停止工作並變為
<defunct>
.[root@backup ~]# ps -ef | grep defunct | more root 4801 29261 0 09:25 pts/5 00:00:00 grep defunct root 5825 1 0 Oct18 ? 00:00:00 [bacula-sd] <defunct>
我的問題是,我怎樣才能殺死這個過程?據我所知,它的父級是 1,它是 init,我不想殺死 init 程序,對嗎?
“通常”殺死此程序不起作用:
[root@backup ~]# kill -0 5825 [root@backup ~]# kill -9 5825
非常感謝您的幫助!
編輯:執行
[root@backup ~]# lsof -p 5825
產生以下輸出:
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME bacula-sd 5825 root cwd DIR 253,0 4096 3801089 /root bacula-sd 5825 root rtd DIR 253,0 4096 2 / bacula-sd 5825 root txt REG 253,0 2110599 368004 /usr/local/sbin/bacula-sd bacula-sd 5825 root mem REG 253,0 75284 389867 /usr/lib/libz.so.1.2.3 bacula-sd 5825 root mem REG 253,0 46680 3604521 /lib/libnss_files-2.5.so bacula-sd 5825 root mem REG 253,0 936908 369115 /usr/lib/libstdc++.so.6.0.8 bacula-sd 5825 root mem REG 253,0 125736 3606807 /lib/ld-2.5.so bacula-sd 5825 root mem REG 253,0 1602128 3606885 /lib/libc-2.5.so bacula-sd 5825 root mem REG 253,0 208352 3606892 /lib/libm-2.5.so bacula-sd 5825 root mem REG 253,0 125744 3606887 /lib/libpthread-2.5.so bacula-sd 5825 root mem REG 253,0 25940 3604573 /lib/libacl.so.1.1.0 bacula-sd 5825 root mem REG 253,0 15972 3604535 /lib/libattr.so.1.1.0 bacula-sd 5825 root mem REG 253,0 46548 3606908 /lib/libgcc_s-4.1.2-20080102.so.1 bacula-sd 5825 root mem REG 253,0 56422480 366368 /usr/lib/locale/locale-archive bacula-sd 5825 root 0r CHR 1,3 1545 /dev/null bacula-sd 5825 root 1r CHR 1,3 1545 /dev/null bacula-sd 5825 root 2r CHR 1,3 1545 /dev/null bacula-sd 5825 root 3u CHR 9,128 6469 /dev/nst0 bacula-sd 5825 root 4u IPv4 1023380 TCP backup:bacula-sd (LISTEN) bacula-sd 5825 root 5u IPv4 2693268 TCP backup:bacula-sd->backup:53957 (CLOSE_WAIT) bacula-sd 5825 root 7u IPv4 3248683 TCP backup:bacula-sd->backup:57629 (CLOSE_WAIT) bacula-sd 5825 root 8u IPv4 3250966 TCP backup:bacula-sd->backup:37650 (CLOSE_WAIT) bacula-sd 5825 root 9u IPv4 3253908 TCP backup:bacula-sd->backup:37671 (CLOSE_WAIT)
刪除殭屍/失效程序的唯一方法是殺死父程序。由於父級是 init (pid 1),這也會關閉您的系統。
這幾乎給你留下了兩個選擇。
- 手動修改程序表,例如。創建一個虛擬程序,將已失效的程序連結為虛擬程序的子程序,然後將其殺死。相當危險,您可能必須手動清理其他程序資源,例如信號量和文件句柄。
- 重新啟動系統。
我會選擇第二個。
檢查是否有核心恐慌,
# dmesg |tail
檢查程序是否處於“D”無法殺死的睡眠狀態,在核心模式下,某些系統呼叫尚未返回(核心糟糕,或其他原因) http://www.nabble.com/What-c auses-an -unkillable-process–td20645581.html