OS:Debian 8 x64
5秒ごとにCPUパーセンテージを以下の形式のCSVファイルに記録したいと思います。
YYYY-MM-DD HH:MM:SS,CPU%
top
プログラムを使用して、awk/grepを使用して((us + sy)/(us + sy + id)* 100)を計算する方法に慣れていません。そうすることで助けていただければ幸いです。
私の検索を通して、top-bn1とtop-bn2を使用している人々の例をいくつか見ました。ただし、ループがtopを呼び出している場合は、バッチモードを使用する必要はまったくないと思います。
これが私が書き始めたシェルスクリプトです。
#!/bin/bash
while sleep 5; do "top | grep "Cpu(s)" | awk '{}' >> cpu.csv; done
これはvmstat
を介して行うことができます。
#!/usr/bin/Perl
open VMSTAT, "vmstat 5|";
<VMSTAT>; <VMSTAT>; # skip the header
while (<VMSTAT>) {
@now = split;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime (time);
printf "%d-%02d-%02d %02d:%02d:%02d,%d%\n", $year+1900, $mon, $mday, $hour, $min, $sec,
$now[12] + $now[13];
}
ほとんどのコードは日付を印刷するためのものです...
1)次の2つのバージョンを比較してみましょう。
_while sleep 0.1 ; do top -d 10 | grep Cpu ; done
#versus batch mode
while sleep 0.1 ; do top -d 10 -bn1 | grep Cpu ; done
_
最初の例では、時間はtop
の更新間隔(_-d 10
_で10秒に設定)で定義され、2番目の例ではwhileループのsleep
コマンドで定義されていることがわかります。限界です。また、最初の例ではtop
が終了しないため、パイプ出力の処理が問題になります。これは、stin
から読み取るプログラムが、特に問題となる「プロセス終了」シグナルを取得しないためです。 awk
やcut
などの列ベースのプログラムの場合。方法を参照してください。
_top -d 0.1 -b | grep Cpu | cut -d' ' -f1
_
top
が生成する間隔ではなく、不規則なバッチで出力を生成しますが、
_while sleep 0.1 ; do top -bn1 | grep Cpu | cut -d' ' -f1 ; done
_
希望の間隔で出力を生成します。
短編小説:while
ループと_top -bn1
_を使用してください
2)awk
処理:
stin
を_top -bn1 | grep Cpu
_から読み取ると、次のものを使用できます。
_awk 'BEGIN { FS == " +" } ; { cmd1="date +%Y-%m-%d" ; cmd2="date +%H:%M:%S" ; while ( cmd1 | getline a ) ; while ( cmd2 | getline b) ; print a,b,($2+$4)/($2+$4+$8)*100"%" }'
_
_BEGIN { FS == " +" }
_は1つ以上の(_+
_)スペースをフィールド区切り文字として使用するため、us、sy、およびidのそれぞれのフィールドは$ 2、$ 4、および$ 8です。
システムコールの結果をawkの変数として読み取るには、cmd1="..." ; while ( cmd1 | getline a)
による回避策が必要です。 @ ghostdog74の答えを参照してください ここ