答案1
最好找到进程失控的根本原因,但要查找任何处于状态S
但使用一定数量 CPU 的进程,可以使用以下脚本:
#!/usr/bin/env bash
ps ahxo pid,state,%cpu |\
while read pid state cpu; do
if [[ "$state" = S ]]; then
if [[ "${cpu%%.*}" -gt 90 ]]; then
echo "woe betide pid $pid"
fi
fi
done
一旦您确定该脚本不会破坏您的系统,请使用 akill
而不是。通过根据字段限制匹配,或者首先使用命令过滤合适的 PID,echo
可以降低危险性。鉴于人性化,很难从输出中捕获“超过 2 小时” ;解析该信息command
pgrep
ps
time
/proc/$pid/stat
可能很危险进程名称中是否出现空格。或者,监控脚本可以变得更加复杂,并维护一个状态计数器,记录它看到具有所需条件的 PID 的次数。也许先看看上面的脚本是否有效,然后再进行更复杂的“超过 2 小时”检查?
另一种方法可能是使用一个监视系统定期向服务发出请求,并在请求开始超时或花费太长时间时让该系统重新启动服务。但对于时不时需要用扫帚敲打的东西来说,这样的创可贴并不是一个好的长期解决方案。
如果服务有某种日志文件表明事情已损坏,那么这可能是自动检测故障并“将其关闭并重新打开”的另一种方法。
当然,如果这种重新启动自动化终止了错误的进程,或者在不应该终止的情况下终止了进程,则可能会出现严重错误。如果管理层不愿意花费必要的资源来解决问题,这可以用作查找和解决问题或停用软件的理由。我有*/5 * * * * /reboot-service
crontab 作业,因为管理不允许修复的某些东西泄漏了那么多内存...哦,是的,您可能想在某处记录自动重新启动脚本,以便在进行更新时禁用它,等等。更多的工作。