[bash]マシンのCPU負荷と空きメモリ状況を1行表示する


あるテストツールをブン回しているときのCPU使用率とメモリ使用率を算出したいと言われまして、時刻とCPU使用率とメモリ使用率を出すスクリプトを書きました。計測結果は1時間ごとのログを取るようにしています。参考にしたページはココココです。

#!/bin/sh
LANG=C
while true
do
    top -n 1 -b -d 1 | grep ^Cpu |
    sed -e "s/^/`date`t/g;s/$/tmemory free is `free -t |
    grep -i ^total | awk '{print int( (1-($3/$2))*100 )}'`%/g" >> `date +%Y%m%d-%H`.log
    sleep 1
done

今回のスクリプトは単純にtopコマンドとfreeコマンドの結果を同じ1行に出力したいと思ったわけで作成したのです。整形の部分はsedコマンドが大活躍ですね。topコマンドですが、そのまま実行するにはちょっと不都合です。なので、繰り返し回数を-nオプションで指定します。秒間1回ずつの出力をしたいので、-nオプションの引数に1を与えて、1回ずつの出力をwhile文で繰り返すことにしました。そして、CPU使用率の出力をsedコマンドで置換し、行頭に日付を、行末にメモリ使用量をつけくわえます。日付、CPU使用率、メモリ使用率の各項目はTABで区切ってやることにしました。

topコマンドの出力結果ですが、これはサマリーエリアに表示されているCPU使用率の部分をgrepで切り出しています。左から、ユーザプロセスの使用時間が1%、システムプロセスの使用時間が1%、実行優先度を変更したユーザプロセスの使用時間が0%、アイドル状態の時間が98%、I/Oの終了待をしている時間、ハードウェア割込み要求での使用時間、ソフトウェア割込み要求での使用時間がそれぞれ0%となっています。つまり、CPUの空きは98%ということになります。

Cpu(s):  1.0% us,  1.0% sy,  0.0% ni, 98.0% id,  0.0% wa,  0.0% hi,  0.0% si

freeコマンドの出力結果ですが、-tオプションをつけることで、実メモリとswapとの合計を出すことにしました。この出力結果のTotalで始まる行がそれです。その後の

awk '{print int( (1-($3/$2))*100 )}'

の部分で、メモリの空き領域をメモリ容量合計で割った結果を百分率の形に計算しています。ほんとに簡単な負荷計測ツールとして使うには、これでいいんじゃないかなー・・・と思います。