我时不时地(每隔几天)注意到某个进程正在使用 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 zenity
。xdialog
据我所知,它是旧版可执行文件的替代品。