時々(数日ごとに)特定のプロセスがCPUを100%使用していることがわかります。このプロセスはavrdude
Arduino IDEによって開始されますが、場合によっては再現できず、図のようにCPU使用率は100%に過ぎませんtop
。
Arduinoボードへのアップロードが開始され、このプロセス中にボードが切断された可能性があります。
私のプロセッサには8つのコアがあるので、コアの1つがいっぱいになったかどうかはすぐにはわかりません。実際、この現象は連続して数回発生し、CPU使用率が100%のコアが3つある場合にのみ目立つようになります。
一部のバックグラウンドタスクでこれを確認し(例: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のバージョンを作成することにしました。この時間はLua 5.1.5- 最新のLuaでは動作するかどうかわからない。
一般的なアイデアはLua popen
(パイプを開く)を使用して実行し、正規top
表現(または模様、Luaで言ったように)。次に、一致する線(ほとんど)がしきい値の割合を超えるかどうかを検討します。これによりテーブルに追加されます。
テーブルが空でない場合、zenity
ユーザーにメッセージを表示するために呼び出されます。開発中に発見されたいくつかの「問題」は次のとおりです。
- zenityに60秒のタイムアウトを追加して、その時点でコンピュータの場所を空にすると、警告ダイアログは表示されません。
--display=:0.0
実行時に表示画面が見えるように追加しましたcron
。私はcrontabで「15分ごとに」テストを次のように単純化しました。
*/15 * * * * /home/nick/check_cpu_usage.lua
top
他のテストを実行したい場合(たとえば、メモリが多すぎる)、正規表現はすべてをキャプチャします。
私はこれが多くのプロセスとサブシェルを起動するよりも速いと思います。うまくいくようです。しきい値を下げ(例:5)、毎分チェックするようにcrontabエントリを変更してテストします。
CPU使用量を確認してください。
#! /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