如何杀死僵尸进程
- 2024-11-06 08:35:00
- admin 原创
- 28
问题描述:
我在前台启动了我的程序(守护程序),然后我用 杀死了它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]
解决方案 1:
僵尸已经死了,所以你不能杀死它。要清理僵尸,它的父进程必须等待它,所以杀死父进程应该可以消灭僵尸。(父进程死后,僵尸将由 pid 1 继承,它将等待它并清除进程表中的条目。)如果你的守护进程正在生成成为僵尸的子进程,那么你就有了一个错误。你的守护进程应该注意到它的子进程何时死亡,并wait
确定它们的退出状态。
以下是向僵尸进程的每个父进程发送信号的示例(请注意,这非常粗糙,可能会杀死您不想要的进程。我不建议使用这种大锤):
# Don't do this. Incredibly risky sledge hammer!
kill $(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}')
解决方案 2:
您可以使用以下命令杀死僵尸进程的父进程来清理僵尸进程:
kill -HUP $(ps -A -ostat,ppid | awk '{/[zZ]/{ print $2 }')
解决方案 3:
我试过:
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}
这会起作用:)
解决方案 4:
在http://www.linuxquestions.org/questions/suse-novell-60/howto-kill-defunct-processes-574612/找到它
2)这是另一位用户的一个很好的建议(感谢 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
18581
,,是僵尸18582
——18583
kill -9 18581 18582 18583
没有效果。
kill -9 31706
消灭僵尸。
解决方案 5:
我试过
kill -9 $(ps -A -ostat,ppid | grep -e '[zZ]'| awk '{ print $2 }')
它对我有用。
解决方案 6:
将这里的几个答案组合成一个优雅的方法,在杀死它之前确认哪个进程已经变成僵尸进程。将脚本添加到.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
}
解决方案 7:
有时父 ppid 无法被杀死,因此杀死僵尸 pid
kill -9 $(ps -A -ostat,pid | awk '/[zZ]/{ print $2 }')
解决方案 8:
在 Mac 上,上述命令/说明均不起作用。要删除僵尸进程,您可以右键单击 docker-icon->troubleshot->clean/purge Data。
解决方案 9:
以上方法我不敢尝试。
我的解决方案是使用 htop,然后检测哪个进程具有 multiprocessing.spawn 并用 -9 将其杀死。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件