CPU使用量を記録するにはどうすればよいですか?ただし、CPU使用率が高い場合、または特定のしきい値に達した場合にのみ該当しますか? (+形式)

CPU使用量を記録するにはどうすればよいですか?ただし、CPU使用率が高い場合、または特定のしきい値に達した場合にのみ該当しますか? (+形式)

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の組み合わせよりも信頼できます。

おすすめ記事