munin向けのpcsensorプラグインを作った

上海問屋のDNSB-35137など、いくつかの販路で取り扱われているUSB接続の温度計 RDing TEMPerV1.2。

その温度をmuninで計測するためにpluginを作った。

今回考慮が必要だった点
・USB温度計を2つつなぐ
・つなぐUSB BUSが同じであるため、CentOS5上で見分けがつかない
 (TEMPerV1.2ではシリアルを含めデバイス内のパラメータが全部一緒で見分ける方法がない)
・2つの温度計の設置位置は違うので、温度差が5度ぐらいある
・pcsensorコマンド実行時、デバイスがオフラインになることが良くある
 (参考→USB温度計 TEMPerV1.2は計測ミスが多い)

あまり複雑なことをするのも嫌だったので、単純な実装としました。

・温度が2つ取得できるまで、再試行する
・温度が低い方から順にソートして「usbtemper0」「usbtemper1」としていく

また、内部で使うコマンドは、うちで作成した「pcsensor-1.0.2 for TEMPerV1.2 with multi device support」を使います。

USB温度計を1個しか繋がない人は「my $maxdevice=1;」に書き換えてください。

#!/usr/bin/perl -w

my $options="-d";
my $maxdevice=2;

my $arg=$ARGV[0];
if(!$arg){ $arg=""; }

if("$arg" eq "config"){
    print "graph_title USB Temperature Sensor\n";
    print "graph_vtitle Celsius\n";
    print "graph_category sensors\n";
    print "graph_args --base 1000 -l 0\n";
}

my @devlist;
my $count=0;
while($count<$maxdevice){
    open(FILE,"/usr/local/bin/pcsensor $options|");
    while(my $line=<FILE>){
        $line =~ s/\n//ig;

        if($line =~ /Temperature/){
            my @strs=split(/ /,$line);

            my $devnumber=$strs[3] ."-". $strs[5];
            my $value=$strs[8];
            $value=~ s/C//ig;
            #$value=int($value);

            $devlist[$count]=$value;
            $count++;
        }
    }
    close(FILE);
}

my $counttmp=0;
foreach $value (sort @devlist){
    if("$arg" eq "config"){
        print "usbtemper".$counttmp.".label USB temper".$counttmp."\n";
    }else{
        print "usbtemper".$counttmp.".value ".$value."\n";
    }
    $counttmp++;
}

これ、仕掛けて3時間ぐらいしたら、kernel panic起こしやがった・・・

“munin向けのpcsensorプラグインを作った” への4件の返信

  1. TEMPer関連の記事、大変参考にさせていただいております。

    当方も2個のセンサーを使用接続し、ZABBIXを使用した温度測定を試みています。
    1週間程運用したところ、貴サイトにて示されているUSBデバイスの応答不能とkernel panicの両方共に遭遇しました。

    kernel panicについては、連続で問い合わせをかけると発生する確立が高いようで、-d オプションの際に発生するケースが多いように感じられます。
    (手動での連打、-dで取得し値をgrepするスクリプトをcronで回した時に発生しました)

    現在は、-D[n]でデバイス指定した状態で取得する連続稼働を試みています。

      1. レスありがとうございます。

        3本のセンサーを取り付け、-D[n]オプションを使って5分間隔の測定を試みましたが、測定開始から10時間程過ぎたところでカーネルパニックが発生しました。
        ファイルサーバに取り付けて測定していたので、大惨事に・・・ 😐

        > 各取得間隔は最低でも5秒は離さないと駄目そうな感じがありますよね

        なるほど。5秒くらいですか。
        シェルスクリプトを経由して叩く方式で組んでいますので、多重起動している時は5秒以上過ぎてから実行するように調整して試してみます。

  2. 連続投稿失礼します。

    OSをCentOS6に代えた所、カーネルパニックは発生しなくなりました。
    3センサーを3分間での測定を4日程動かしましたが、一度もカーネルパニックは発生しませんでした。

    しかし、USBのデバイスエラーは相変わらず発生しています。
    対策として -d の結果をテンポラリに書き出し、バス番号でgrepして温度の抽出を行い、正常に値が取れない場合はコマンド実行をリトライするスクリプトを噛まして測定しています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください