shell 如何杀死僵尸进程

kmb7vmvb  于 2022-12-04  发布在  Shell
关注(0)|答案(9)|浏览(273)

我在前台启动了我的程序(一个守护程序),然后我用kill -9杀死了它,但是我得到了一个僵尸进程,我不能用kill -9杀死它。如何杀死一个僵尸进程?
如果僵尸进程是一个死进程(已经被杀死),我如何从ps aux的输出中删除它?

root@OpenWrt:~# anyprogramd &
root@OpenWrt:~# ps aux | grep anyprogram
 1163 root      2552 S    anyprogramd
 1167 root      2552 S    anyprogramd
 1169 root      2552 S    anyprogramd
 1170 root      2552 S    anyprogramd
10101 root       944 S    grep anyprogram
root@OpenWrt:~# pidof anyprogramd
1170 1169 1167 1163
root@OpenWrt:~# kill -9 1170 1169 1167 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [anyprogramd]
root@OpenWrt:~# kill -9 1163
root@OpenWrt:~# ps aux |grep anyprogram
 1163 root         0 Z    [anyprogramd]
b4lqfgs4

b4lqfgs41#

将这里的几个答案组合成一个优雅的方法,在杀死进程之前确认哪个进程是僵尸进程。将脚本添加到.bashrc/.zshrc并运行killZombie命令。

killZombie() {
    pid=$(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}');
    if [ "$pid" = "" ]; then
        echo "No zombie processes found.";
    else
        cmd=$(ps -p $pid -o cmd | sed '1d');
        echo "Found zombie process PID: $pid";
        echo "$cmd";
        echo "Kill it? Return to continue… (ctrl+c to cancel)";
        read -r;
        sudo kill -9 $pid;
    fi
}
pjngdqdw

pjngdqdw2#

僵尸已经死了,所以你不能杀死它。要清理僵尸,它必须由它的父母伺候,所以杀死父母应该可以消除僵尸。(父进程死亡后,pid1将继承僵停进程,pid1将等待僵停进程并清除其在进程表中的条目。)如果您的守护进程正在产生成为僵停进程的子进程,你有一个bug。2你的守护进程应该注意到它的子进程何时死亡,并通过wait来确定它们的退出状态。
下面是一个示例,说明如何向僵尸进程的父进程发送信号(请注意,这是非常粗糙的,可能会杀死您不希望的进程。我不建议使用这种大锤):

# Don't do this.  Incredibly risky sledge hammer!
kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}')
66bbxpm5

66bbxpm53#

您可以使用以下命令终止僵停进程的父进程来清理僵停进程:

kill -HUP $(ps -A -ostat,ppid | awk '{/[zZ]/{ print $2 }')
n1bvdmb6

n1bvdmb64#

我试探着:

ps aux | grep -w Z   # returns the zombies pid
ps o ppid {returned pid from previous command}   # returns the parent
kill -1 {the parent id from previous command}

这将起作用:)

ugmeyewa

ugmeyewa5#

在x1e0 f1 * 找到

2)这里有一个伟大的提示,从另一个用户(Thxs Bill Dandreta):有时候

kill -9 <pid>

不会终止进程。运行

ps -xal

第四个字段是父进程,杀死所有僵尸的父进程,僵尸就死了!
范例

4 0 18581 31706 17 0 2664 1236 wait S ? 0:00 sh -c /usr/bin/gcc -fomit-frame-pointer -O -mfpmat
4 0 18582 18581 17 0 2064 828 wait S ? 0:00 /usr/i686-pc-linux-gnu/gcc-bin/3.3.6/gcc -fomit-fr
4 0 18583 18582 21 0 6684 3100 - R ? 0:00 /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/cc1 -quie

是僵尸

kill -9 18581 18582 18583

无效。

kill -9 31706

清除僵尸。

92dk7w1h

92dk7w1h6#

我试过了

kill -9 $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')

对我也很有效。

hts6caw3

hts6caw37#

有时父ppid不能被删除,因此删除僵停pid

kill -9 $(ps -A -ostat,pid | awk '/[zZ]/{ print $2 }')
ui7jx7zq

ui7jx7zq8#

在Mac上,以上命令/指令都不起作用。要删除僵尸进程,您可以右键单击停靠图标-〉故障排除-〉清理/清除数据。

uyto3xhc

uyto3xhc9#

我不敢尝试以上方法。
我的解决方案是htop然后检测哪个进程有多处理。产生并杀死它。

相关问题