当指定进程达到一定 CPU 百分比时,脚本会终止该进程

当指定进程达到一定 CPU 百分比时,脚本会终止该进程

我有一台 Ubuntu 服务器 20。我正在运行 4 个具有以下名称的进程:

project-A
project-B
project-C
project-D

一切运行良好,但有时我看到其中一个项目消耗 CPU 并达到 300%。

因此我希望脚本在 CPU 使用率达到 300% 时终止(例如)“项目 B”。

答案1

以下脚本应终止md5sum使用超过 50% CPU 的任何进程。根据需要替换md5sum和。50

while true; do
    PID=$(pidof -s md5sum || cat /proc/sys/kernel/pid_max)
    if [[ $(ps -p $PID -o %cpu= |grep -Po '^\s*\K[0-9]+') -gt 50 ]]; then
        echo killing PID $PID
        kill $PID
    fi
    sleep 1
done

笔记:

  • 在替换上述脚本之前,请尝试pidof -s your_process确保它可以正常工作。md5sum
  • 如果上述方法不能真正终止该进程,则可能需要使用蛮力kill -9 $PID而不是kill $PID,但只有在第一种方法不起作用时才这样做。
  • 要在一行中执行一次上述操作(不使用循环):
PID=$(pidof -s md5sum || cat /proc/sys/kernel/pid_max); if [[ $(ps -p $PID -o %cpu= |grep -Po '^\s*\K[0-9]+') -gt 50 ]]; then echo killing PID $PID; kill $PID; fi

解释:

  • while true; do ... sleep 1; done循环直到按下 ctrl-c;这也允许终止多个匹配的进程
  • pidof -s md5sum || cat /proc/sys/kernel/pid_maxmd5sum 进程的第一个 ( -s) 进程 ID,如果没有,则为不存在的 PID
  • ps -p $PID -o %cpu=$PID 进程的 CPU 利用率(以十进制百分比表示)
  • |grep -Po '^\s*\K[0-9]+'将 CPU 百分比剥离为整数
  • if [[ ... -gt 50 ]]如果 ... 大于 50

相关内容