我有一台有8核心CPU的机器,但是每天所有的CPU核心都会被休眠的进程阻塞,并且需要手动杀死来恢复CPU。
我想要自动化的过程是
我怎样才能找到这些过程的PID并杀死它们呢?

来自htop的输出,该输出显示处于休眠状态并阻塞CPU内核的进程具有PID: 134425。
注意:
这给出了所有休眠进程的PID,但没有考虑CPU的使用
awk '/sleeping/{ $0=FILENAME; gsub(/[^0-9]/, ""); print $0 }' /proc/[0-9]*/status
发布于 2022-08-18 16:25:01
最好是找出进程失控的根本原因,但要找到状态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使用kill而不是echo,一旦您确信脚本不会破坏您的系统。通过限制基于command字段的匹配,或者首先使用pgrep命令过滤适当的PID,可以减少这种情况的危险性。考虑到ps是人性化的,很难从time输出中捕获“超过2小时”;如果在进程名中出现空白,则从/proc/$pid/stat 可能会很危险解析该信息。或者,监视脚本可以变得更加复杂,并维护一个状态计数器,使其能够在需要的条件下多次看到PID。也许看上面的脚本是否有效,首先,在进行更复杂的“2小时以上”检查之前?
另一种方法可能是拥有一个对服务进行定期请求的监视系统,并在请求开始超时或花费太长时间时重新启动服务。但是这样的创可贴并不是一个很好的长期解决方案,有时需要用扫帚来解决。
如果服务有某种类型的日志文件指示故障,那么这可能是另一种自动检测故障并“再次关闭并重新打开”的方法。
当然,如果重新启动自动化杀死了错误的进程,或者在不应该终止的情况下杀死了流程,那么这种重新启动自动化可能会发生严重的错误;这可能被用作查找和修复问题的理由,或者在管理不愿意花费必要的资源来解决问题的情况下退出软件。我做过*/5 * * * * /reboot-service crontab作业,因为管理人员不允许修复的东西泄漏了那么多内存.哦,是的,您可能想在某个地方记录自动重新启动脚本,在进行更新时禁用它,等等。更多的工作。
https://unix.stackexchange.com/questions/713991
复制相似问题