如何检测并警告某个进程是否长时间使用100% CPU?

如何检测并警告某个进程是否长时间使用100% CPU?

我时不时地(每隔几天)注意到某个进程正在使用 100% CPU。该过程avrdude由 Arduino IDE 启动,在某些情况下,我无法重现该 IDE,它的 CPU 利用率仅为 100%,如图所示top

可能的情况是,开始上传到 Arduino 板,并且在此过程中板断开连接。

我的处理器有 8 个核心,因此不会立即明显看出其中一个核心是否已满。事实上,只有当它连续发生几次时,它才会变得明显,然后我可能有 3 个核心,CPU 利用率为 100%。

有没有办法让一些后台任务对此进行检查(例如,每 15 分钟),然后以某种方式提醒我(例如,一些弹出对话框)?我正在使用 Ubuntu 14.04 LTS。


感谢 MelBurslan 的回答,但我很困惑为什么它没有完全发挥作用。我当前的脚本是这样的:

cpupercentthreshold=2
pstring=""
top -b -n 1 | sed -e "1,7d" | while read line; do
cpuutil=$(echo ${line} | awk '{print $9}' | cut -d"." -f 1)
procname=$(echo ${line} | awk '{print $12}' )
if [ ${cpuutil} -ge ${cpupercentthreshold} ]
then
  echo ${cpuutil}
  pstring=${pstring}${procname}" "
  echo pstring is currently ${pstring}
fi
done
echo pstring is ${pstring}
if [ -n "${pstring}" ]
then
  zenity --title="Warning!" --question --text="These processes are above CPU threshold limit ${pstring}" --ok-label="OK"
fi

我降低了测试的门槛。然而,正如您所看到的,它收集了各个进程,但最终的测试(显示对话框)失败了,因为 pstring 由于我看不到的原因突然变空:

13
pstring is currently VirtualBox
6
pstring is currently VirtualBox Xorg
6
pstring is currently VirtualBox Xorg compiz
6
pstring is currently VirtualBox Xorg compiz ibus-engin+
6
pstring is currently VirtualBox Xorg compiz ibus-engin+ top
pstring is

答案1

在阅读了 MelBurslan 的答案和各种评论后,我决定尝试(受到他们建议的启发)用 Lua 做一个版本。这是在卢阿5.1.5- 我不确定它是否适用于最新的 Lua。

总体思路是使用Lua的popen(打开一个管道)来执行top,然后使用正则表达式(或图案,正如 Lua 中所说的那样)。然后考虑匹配线(其中大部分)是否超过阈值百分比。如果这样做,它们将被添加到表中。

如果表不为空,则zenity调用 then 向用户显示一条消息。我在开发过程中发现的一些“陷阱”:

  • 我在 zenity 中添加了 60 秒的超时,这样,如果您当时不在电脑旁,就不会出现警告对话框。
  • 我添加了--display=:0.0以便在运行时找到显示屏幕cron
  • 我在 crontab 中简化了“每 15 分钟”的测试,如下所示:

    */15 * * * * /home/nick/check_cpu_usage.lua
    
  • 正则表达式捕获所有内容,以防top您想做其他测试(例如,使用太多内存)。

我认为这比启动大量进程和子 shell 更快。似乎工作正常。通过降低阈值(例如降低到 5)并更改 crontab 条目以每分钟检查一次来进行测试。


检查CPU使用情况.lua

#! /usr/local/bin/lua

THRESHOLD = 90  -- percent

-- pipe output of top through a file "f"
f = assert (io.popen ("top -b -n 1 -w 512"))
t = { }

-- check each line
for line in f:lines() do

  -- match top output, eg.
  --   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  -- 30734 nick      20   0 6233848 3.833g 3.731g S   8.6 12.2   3:11.75 VirtualBox

  local pid, user, priority, nice, virt, res, shr, 
        status, cpu, mem, time, command =
    string.match (line,
      "^%s*(%d+)%s+(%a+)%s+(%-?%d+)%s+(%-?%d+)" ..
--         pid      user   priority    nice
      "%s+([%d.]+[g]?)%s+([%d.]+[g]?)%s+([%d.]+[g]?)%s+([DRSTZ])%s+(%d+%.%d+)%s+(%d+%.%d+)" ..
--        virtual          res           shr             status       %cpu        %mem
      "%s+([0-9:.]+)%s+(.*)$")
--         time       command

  -- if a match (first few lines won't) check for CPU threshold
  if pid then
    cpu = tonumber (cpu)
    if cpu >= THRESHOLD then
      table.insert (t, string.format ("%s (%.1f%%)", command, cpu))
    end -- if
  end -- if

end -- for loop

f:close()

-- if any over the limit, alert us
if #t > 0 then
  os.execute ('zenity --title="CPU usage warning!" --info ' ..
              '--text="These processes are using more than ' ..
              THRESHOLD .. '% CPU:\n' ..
              table.concat (t, ", ") ..
              '" --ok-label="OK" ' ..
              '--timeout=60 ' ..   -- close dialog after one minute in case we aren't around
              '--display=:0.0 '  -- ensure visible when running under cron
              )
end -- if

答案2

创建一个像这样的简单脚本

cpupercentthreshold=75
pstring=""
top -b -n 1 | sed -e "1,7d" | while read line; do
cpuutil=$(echo ${line} | awk '{print $9}' | cut -d"." -f 1)
if [ ${cpuutil} -ge ${cpupercentthreshold} ]
then
  pstring=${pstring}${procname}" "
fi
done
if [ -z "${pstring}" ]
then
  echo "Everything looks good $(date)" >>mylogfile #if you want to keep track 
else
  zenity --title="Warning!" --question --text="These processes are above CPU threshold limit ${pstring}" --ok-label="OK"
fi

然后运行命令crontab -e并插入如下行:

0,15,30,45 * * * * /path/to/my/checker/script 

保存并退出。然后执行

chmod 755 /path/to/my/checker/script

我不太熟悉,zenity因为我已经有一段时间没有在 Linux 服务器上使用图形显示了,也从来不需要使用它。因此,如果由于某种原因失败,请在 上寻求帮助man zenityxdialog据我所知,它是旧版可执行文件的替代品。

相关内容