CPU使用量をどのように記録できますか?ただプロセス使用率が特定のしきい値(30%以上など)を超えるとは何ですか?
私が達成したいのは、(シェルスクリプトを使用して)おおよそ次のとおりです。
currCPU = $(cpu-checker)
while true; do
if(($currCPU >= 80)); then
echo "$(date +%F %R)"
$(top -n 1 | head -n 12 | tail -n 3 | replace "\n" "\n ") >> someFile.log
fi
sleep 2.5
done
# (cpu-checker) and (replace "\n" "\n ") are the
# problematic part
予想される出力は(やや)次のようになります。
2020-08-03 02:31
16979 root 20 0 43188 4280 3396 R 104.3 0.0 0:00.06 super-process-1
1 root 20 0 225760 9428 6648 S 0.0 0.0 0:08.94 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.04 kthreadd
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H
2020-08-03 09:44
16979 root 20 0 43188 4280 3396 R 93.3 0.0 0:00.06 another-process
1 root 20 0 225760 9428 6648 S 0.0 0.0 0:08.94 systemd
2 root 20 0 0 0 0 S 102.0 0.0 0:00.04 random-proce
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H
私はUbuntu Server 16.04.4でいくつか試しました。 (それが私が持っている唯一の環境だからです。)
まだ、その部分については何も見つかりませんでしたがcpu-checker
、書式指定部分(replace "\n" "\n "
)については使ってみましたが役に立ちませtr "\n" "\n "
んsed G
でした。
ベストアンサー1
いくつかのヒント:
sed 's/^/ /'
行のすべての先頭を空白に置き換えます。
uptime | sed 's/.*load average: //;s/,.*//'
最後の瞬間の平均負荷スコア(CPU%)を提供します。これは、システムがどれほど忙しいかを示す尺度です。
@Paul_Pedantが彼の意見で提案したように:
top -b -n 1 | awk '/%Cpu/ || $1 == "PID" || $1 ~ /^[0-9]+/; NR >= 12 { exit; }'
実際のCPU比を提供します。
または冒険心があり、いくつかのPythonコードが気に入らない場合:
from __future__ import print_function
from time import sleep
last_idle = last_total = 0
with open('/proc/stat') as f:
fields = [float(column) for column in f.readline().strip().split()[1:]]
idle, total = fields[3], sum(fields)
idle_delta, total_delta = idle - last_idle, total - last_total
last_idle, last_total = idle, total
sleep(1)
with open('/proc/stat') as f:
fields = [float(column) for column in f.readline().strip().split()[1:]]
idle, total = fields[3], sum(fields)
idle_delta, total_delta = idle - last_idle, total - last_total
last_idle, last_total = idle, total
utilisation = 100.0 * (1.0 - idle_delta / total_delta)
print('%5.1f' % utilisation)
あなたのために読んで/proc/stat
計算してみてください。
date '+%F %R'
まったく同じ出力を提供します
echo "$(date '+%F %R')"
出力をログにリダイレクトできます。
ついに、
top -bn 1 | sed '1,/PID *USER/d' | head -3
おそらくあなたtail
とあなたhead
の組み合わせよりも信頼できます。