2012年3月21日水曜日

Mac, Geektool, CPU Usage, Ascii Graph

今日はGeektoolでCPU使用率を「無理やり」グラフ表現する話.
Geektoolはグラフの表示ができない.CPU使用率をグラフ表現しようとした場合,一般的には2つの方法が考えられる.
1.Geektoolでの表示はあきらめて,ほかのユーティリティを使う.例えばXRGとか.
2.ほかのユーティリティで画像を保存して,Geektoolのimageで表示する.
  1については,ググればいくらでも出てくるので,面白くない.ということで,なんとかGeektoolで表示できないものかと考えた.2については,gnuplotというグラフ描画ユーティリティを使った方法を試した.ただし,この方法については,gnuplotのインストールとコマンドの習得,画像作成時のCPUとHDDへの負荷が若干気になるところだ.とはいえ,面白い結果が得られた(とりあえずうまいこと動いた)ので,後日改めて書き残そうと思う.
今日は,この1,2以外の方法を模索した結果を書く.つまり,
3.テキストでグラフを描く
である.いつものように,ここここにスクリプトを置いておく.基本的には,シェルスクリプトと,私の一番得意な言語PHPでできている.
無茶しやがって・・・というAAが飛んできそうだが,gnuplotよりは平易な設定でできると思う.CPU負荷はどうなのかわからない.それと,2の方法よりも画像を出力しない分,HDDへの書き込みは少ないが,この方法でもHDDへの書き込みが頻繁(geektoolで指定した秒数毎)に発生する.これは,その秒毎にCPU使用率をファイルへ保存するためだ.
もっとも,この点は,CPU使用率のログファイルの書き込み先をRAM Diskに移したtmpフォルダなどに指定してやれば,ほぼクリアだろう.各人の環境によるということだ.


cpulog.sh
#!/usr/bin/sh

if [ "`wc -l /tmp/cpu.log | awk '{print $1}'`" -gt 300 ]; then
cat /tmp/cpu.log | tail -300 > /tmp/cpu.log.swp
mv /tmp/cpu.log.swp /tmp/cpu.log
fi

top -R -F -u -l2 | head -4 | tail -1 | sed -E -e "s/CPU usage: (.*)% user.*/\1/" >> /tmp/cpu.log

#php ascii graph
php /PATH/graph.php /tmp/cpu.log
赤字のところは,例の如く,それぞれの環境に合わせて書き換える必要がある.
このシェルスクリプトでやっていることは,呼び出されるたびにtopコマンドでcpu使用率を取得して,最新の300件を保存,その後にphpスクリプトの呼び出しである.この300を好きな数字に変更すれば,ログはいくらでも取れる.

graph.php
#!/usr/bin/php
<?php
$str = "";

function Tics($i){
    $tics=array(0,20,40,60,80,100);
    if(in_array($i,$tics)){
        $str ="-";
    }else{
        $str =" ";
    }
    return $str;
}
Ticsは,グラフのメモリを指定している.arrayが表示する目盛りになる.
if($argv[1] && @file_exists($argv[1])){
    $f = file($argv[1]);
 引数で指定したファイルを開いて,配列変数$fに格納
    for($i=100;$i>0;$i--){
        $str.=Tics($i);
        for($j=0;$j<count($f);$j++){
            if($f[$j]>$i){
                $str.="#";
            }else{
                $str.=" ";
            }
        }
        $str.=Tics($i);
        $str.="\n";
    }
}else{
    $str ="target was not found\n";
}

echo $str;
?>
これで,グラフが描ける.
続いて,Geektoolの設定だが,shellのコマンドで,
sh /PATH/cpulog.sh
を指定する.PATHは例の如く,環境に従うべし.refreshを適当な秒数に設定するのを忘れないように.ちなみに,私の環境では1秒になっている.
それから,フォント指定をする.もちろん,フォント種は等幅フォントであればなんでもかまわない.重要なのはフォントサイズだ.Geektoolでは,最小9までしかフォントサイズリストに表示されないが,それよりも小さいサイズも指定できる.直接数字を入力すればいい.2以上がよろしいのではないかと.
こうして,できたのが,↓

いうまでもないが,利用する際は自己責任で.

0 件のコメント:

コメントを投稿