web-dev-qa-db-ja.com

CPU使用率をCSVファイルに保存します

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
1
linguru772x

これは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
Ferenc Wágner

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から読み取るプログラムが、特に問題となる「プロセス終了」シグナルを取得しないためです。 awkcutなどの列ベースのプログラムの場合。方法を参照してください。

_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の答えを参照してください ここ

0
Fiximan