Bash 脚本用于查找僵尸进程?

Bash 脚本用于查找僵尸进程?

最近我注意到我有一个进程会随机崩溃并变成 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)如您所见,调用 并清除僵尸只是时间问题。如果一段时间内僵尸数量很多,请考虑这是一个编程缺陷,您应该考虑修复(或请求修复)代码,而不是rebooting,这绝对没有必要,也不应该这样做。


要查找僵尸进程,请获取STATE进程的,如果为Z,则该进程为僵尸进程:

ps -eo pid,ppid,state,cmd | awk '$3=="Z"'

这里我只选取了 PID、PPID、STATE 和 COMMAND 等字段。

相关内容