查找睡眠时间超过 2 小时且 CPU 使用率大于 90% 的进程的 PID

查找睡眠时间超过 2 小时且 CPU 使用率大于 90% 的进程的 PID

我有一台 8 核 CPU 的机器,但每天所有的 CPU 核心都会被睡眠进程阻塞,需要手动杀死才能恢复 CPU。

我想自动杀死以下进程

  • 睡眠超过2小时并且
  • CPU 使用率大于 90%

如何找到此类进程的 PID 并杀死它们?

在此输入图像描述

htop 的输出显示 PID:134425 的进程处于睡眠状态并阻塞 CPU 核心

笔记:

这给出了所有睡眠进程的 PID,但没有考虑 CPU 使用情况

awk '/sleeping/{ $0=FILENAME; gsub(/[^0-9]/, ""); print $0 }' /proc/[0-9]*/status

答案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 小时” ;解析该信息commandpgreppstime/proc/$pid/stat 可能很危险进程名称中是否出现空格。或者,监控脚本可以变得更加复杂,并维护一个状态计数器,记录它看到具有所需条件的 PID 的次数。也许先看看上面的脚本是否有效,然后再进行更复杂的“超过 2 小时”检查?

另一种方法可能是使用一个监视系统定期向服务发出请求,并在请求开始超时或花费太长时间时让该系统重新启动服务。但对于时不时需要用扫帚敲打的东西来说,这样的创可贴并不是一个好的长期解决方案。

如果服务有某种日志文件表明事情已损坏,那么这可能是自动检测故障并“将其关闭并重新打开”的另一种方法。

当然,如果这种重新启动自动化终止了错误的进程,或者在不应该终止的情况下终止了进程,则可能会出现严重错误。如果管理层不愿意花费必要的资源来解决问题,这可以用作查找和解决问题或停用软件的理由。我有*/5 * * * * /reboot-servicecrontab 作业,因为管理不允许修复的某些东西泄漏了那么多内存...哦,是的,您可能想在某处记录自动重新启动脚本,以便在进行更新时禁用它,等等。更多的工作。

相关内容