ユーザログイン


CentOS5.2 on D945GCLF でのプロセッサの温度監視、メール通報

ここ数日の温度の推移、徐々に熱くなってるな~
ここ数日の温度の推移、徐々に熱くなってるな~

夫です。
真夏の中、冷房もないうちの中に放置されているATOMサーバが若干気になります。
TDPが低く、あまり熱くならないプロセッサとはいえ、日本の夏は過酷です。
http://www.intel.co.jp/jp/products/processor/atom/index.htm
http://download.intel.com/design/processor/designex/319979.pdf
によればATOM 230プロセッサでは
0℃?85.2℃が動作保証範囲で4WのTDPとのこと。
80度をオーバーするようであれば、クーリングを再検討したほうがよさそうです。
ということで、先日設定したsonsorsの情報とhddtempの情報を元に温度監視スクリプトを作成。

メール送信部分は以下のサイトのperlソースを参考にしました。
http://d.hatena.ne.jp/mzt/20080219/p1

スクリプトは以下

!/usr/bin/perl
use lib '/usr/lib/perl5';
use Jcode;
use Net::SMTP;
use Net::SMTP::SSL;
use MIME::Entity;
# followings are sensor value read routine
my $ChipTemp;
my $CPUTemp;
my $SysTemp;
my $HDDTemp;
# 警報メール発出の閾値(温度℃)。適当に変更してください。
my $ChipLimit=70;
my $CPULimit=80;
my $SysLimit=70;
my $HDDLimit=60;
my $smtp_server = 'smtp.gmail.com';
my $smtp_port = '465';
my $smtp_acc = 'あなたのアカウント@gmail.com';
my $smtp_pwd = 'あなたのパスワード';
my $mail_to = '送信先メールアドレス';
#my $mail_bcc = 'bcc@example.com'; #必要に応じて
#my $mail_from = 'from@example.com'; #必要に応じて
&read_sensor();
&read_hddtemp();
if($ChipTemp >= $ChipLimit || $CPUTemp >= $CPULimit || $SysTemp >=$SysLimit || $HDDTemp >= $HDDLimit){
    #ホスト名取得
    open(IN,"/bin/hostname |");
    }
    close(IN);
    #現在時刻取得.
    $time = localtime(time);
    #subject作成
    $subject="Thermal check error at $hostname";
    #body情報の作成.
    $body="Thermal error\nhostname:$hostname$time\nChipTemp=$ChipTemp\nCPUTemp=$CPUTemp\nSysTemp=$SysTemp\nHDDTemp=$H
DDTemp\n";
    #メール送信
    &sendmail($subject,$body);
}
exit();
sub read_sensor{
    open(IN,"/usr/local/bin/sensors -A |")||die("cannot open sensors");
    while($line=){
        @a=split(/\s+/, $line);
        if($a[0] eq "Chip") {
           $ChipTemp=substr($a[2],1,4);
        }
        if($a[0] eq "CPU") {
           $CPUTemp=substr($a[2],1,4);
        }
        if($a[0] eq "Sys") {
            $SysTemp=substr($a[2],1,4);
        }
    }
#    printf("CPU=%d,Chip=%d,Sys=%d\n",$CPUTemp,$ChipTemp,$SysTemp);
    close(IN);
}
sub read_hddtemp{
    #/dev/sda、パスはご使用の環境に合わせて変更してね。
    open(IN,"/usr/sbin/hddtemp /dev/sda |")||die("cannot open hddtemp");
    while($line=){
        @a=split(/\s+/, $line);
            $HDDTemp=substr($a[2],0,2);
    }
#    printf("HDD=%d\n",$HDDTemp);
    close(IN);
}
# followings are mail send routine
sub sendmail{
    ($subject,$body) = @_;
    if($subject eq NULL){
        $subject="defalut subject\n";
    }
    if($body eq NULL){
        $body="body\n";
    }
    my $mail_subject = $subject;
    my $mail_body = <<"_MAILBODY_";
$body;
_MAILBODY_
    $mail_subject = jcode($mail_subject)->jis;
    $mail_subject = jcode($mail_subject)->mime_encode;
    $mail_to = jcode($mail_to)->jis;
    $mail_to = jcode($mail_to)->mime_encode;
    $mail_bcc = jcode($mail_bcc)->jis;
    $mail_bcc = jcode($mail_bcc)->mime_encode;
    $mail_from = jcode($mail_from)->jis;
    $mail_from = jcode($mail_from)->mime_encode;
    $mail_body = jcode($mail_body)->jis;
    my $err;
    my $oSmtp;
    my $oMime;
    $oSmtp = Net::SMTP::SSL->new($smtp_server,Port => $smtp_port, Debug => 0);
    if($oSmtp->auth($smtp_acc,$smtp_pwd)){
        $oSmtp->mail($mail_from);
        $oSmtp->to($mail_to);
        $oSmtp->bcc($mail_bcc);
        $oSmtp->data();
        $oMime = MIME::Entity->build(
                                     From     => $mail_from,
                                     To       => $mail_to,
                                     Bcc      => $mail_bcc,
                                     Subject  => $mail_subject,
                               Data     => $mail_body);
#特に添付は必要なかったので、コメントアウト。適時要望に応じて変更
#       $oMime->attach(
#                      Path     => '/home/xxxxxxxx/hogefuga.csv',
#                      Type     => "application/octet-stream",
#                      Encoding => "Base64"
#                      );
        $oSmtp->datasend($oMime->stringify);
        $oSmtp->dataend();
        $oSmtp->quit;
    }else{
        $err = 'SMTP Server Authentication Error!!';
    }
}

こんな感じのスクリプトをcrontabに設定して定期的に動作するようにしておけば、危険域に入ったとたんメール送信してくれます。
また、もうちょっと拡張して、本当に危なくなったら、system関数でシャットダウンを呼ぶようにしておくのもいいかもしれません。

お役に立ちましたらクリックをお願いします。
人気ブログランキングへ

この記事をはてなブックマーク: