最近我注意到我有一个进程会随机崩溃并变成 PPID 为 1 (init) 的僵尸进程。有人告诉我,解决这个问题的唯一方法是重新启动 PC(或向 init 发送 SIGCHLD,据我所知,这是....冒险/无用的。)
本质上,我想要做的是编写一个 bash 脚本,它只会查找僵尸进程,如果有,则重新启动 PC。
目前,我使用这个脚本来监视该进程本身:
ps auxw | grep ethminer | grep -v grep > /dev/null
if [ $? != 0 ]
then
sudo reboot
fi
现在,当 ethminer 正在运行或未运行时,此脚本似乎都可以正常工作;如果它在进程表中没有看到 ethminer,它将重新启动机器,如果没有看到,它将不执行任何操作。
但是,(从我承认的松散的理解来看)由于当进程变成僵尸时没有退出代码if [ $? != 0 ]
,所以不会得到任何输入,因此不会执行任何操作。
有什么办法可以修复/修改此脚本,以便它能按照我的要求执行吗?还是我这里离题太远了?
谢谢!
答案1
当它们是僵尸进程时,你不需要这么做reboot
。原因如下:
当进程完成时,但其父进程尚未调用
wait(2)
来获取其返回代码,则该进程变为僵尸进程僵尸进程不占用任何物理或虚拟资源,除了内核进程表中的一个条目
一旦父进程调用,
wait(2)
僵尸进程将被正确收割,进程表条目将被删除如果僵尸进程变成孤儿进程,即它的父进程死亡,那么
init
(PID 1)将继承该进程,并通过调用以下方法收割它:wait(2)
wait(2)
如您所见,调用 并清除僵尸只是时间问题。如果一段时间内僵尸数量很多,请考虑这是一个编程缺陷,您应该考虑修复(或请求修复)代码,而不是reboot
ing,这绝对没有必要,也不应该这样做。
要查找僵尸进程,请获取STATE
进程的,如果为Z
,则该进程为僵尸进程:
ps -eo pid,ppid,state,cmd | awk '$3=="Z"'
这里我只选取了 PID、PPID、STATE 和 COMMAND 等字段。