ようこそNICのホームページへ(なが〜い試運転中 from 2001/5/12)
  • @nifty atnifty-ddns ddo.jp dip.jp   HP パソコン 健康 落語 海外 思うまま 電子工作
  • サーバーXS36V4のCPU温度を測る
    30分毎の記録とリアルタイムでウェブ表示

  • Last update:2018/6/21    Build:2018/6/21
  • リアルタイムでCPU温度を知る 電子工作のページへ 
     
     サーバー XS36V4のCPU温度を測ろうと思った。
    一つはcronで廻して30分毎に記録する。もう一つはウェブからリアルタイムで 温度を計測できるようにする。

    0.CPU温度を取り出すには?

    CPU温度を計測するには、ソフトの「sensors」を使う
    USER@ubuntu-server:~/sensors$ sensors
    acpitz-virtual-0
    Adapter: Virtual device
    temp1:        +26.8°C  (crit = +90.0°C)
    
    coretemp-isa-0000
    Adapter: ISA adapter
    Core 0:       +40.0°C  (high = +105.0°C, crit = +105.0°C) <==ここ
    Core 1:       +40.0°C  (high = +105.0°C, crit = +105.0°C) <==ここ
    Core 2:       +42.0°C  (high = +105.0°C, crit = +105.0°C) <==ここ
    Core 3:       +42.0°C  (high = +105.0°C, crit = +105.0°C) <==ここ
    
    it8728-isa-0a40
    Adapter: ISA adapter
    in0:          +0.71 V  (min =  +2.48 V, max =  +0.89 V)  ALARM
    in1:          +1.38 V  (min =  +2.05 V, max =  +1.66 V)  ALARM
    in2:          +0.86 V  (min =  +1.07 V, max =  +2.58 V)  ALARM
    in3:          +1.03 V  (min =  +1.36 V, max =  +2.69 V)  ALARM
    in4:          +2.22 V  (min =  +2.28 V, max =  +2.98 V)  ALARM
    in5:          +2.22 V  (min =  +2.72 V, max =  +2.82 V)  ALARM
    in6:          +2.22 V  (min =  +1.72 V, max =  +1.36 V)  ALARM
    3VSB:         +3.31 V  (min =  +5.09 V, max =  +3.38 V)  ALARM
    Vbat:         +3.24 V  
    fan1:           0 RPM  (min =   42 RPM)  ALARM
    fan2:           0 RPM  (min =   11 RPM)  ALARM
    fan3:           0 RPM  (min =   22 RPM)  ALARM
    temp1:        +41.0°C  (low  = -116.0°C, high = -65.0°C)  ALARM  sensor = thermistor
    temp2:        +45.0°C  (low  = +71.0°C, high = +89.0°C)  sensor = thermistor
    temp3:         -8.0°C  (low  = -43.0°C, high = -19.0°C)  ALARM  sensor = thermistor
    intrusion0:  ALARM
    
    となります。
    この中からCore0〜3を取り出す sensors | grep Core > out_file でよい。 その後、1行ずつ読み込み(全4行)温度をパターンマッチで取り出す。 後はファイルに出力し記録する又はwebでリアルタイムに見る

    1.30分毎にファイルにCPU温度を記録する

    ファイルに出力するperlスクリプトはこちら
    #!/usr/bin/perl -w  
    #               -w ワーニングを出す
    # ~nic/sensors/sensors.pl
    #  cron で定時で取り込む
    # CPUの温度を出力する
    # 2018/04/04(水)
    #
    use strict; # 宣言した変数以外を使えなくする
    
    
    my @core_ondo;
    my $temp_ondo;
    my $out_file="/home/USER/sensors/cpu_ondo.txt" ; # 出力ファイル名
    my $sens_kari="/home/USER/sensors/kari.txt";     # sensorsの結果を出力する仮ファイル
    my $ii=-1 ;
    my $line ;
    
    
    # 時刻出力用
    my $sec;
    my $min;
    my $hour;
    my $mday;
    my $mon;
    my $year;
    my $wday;
    my $yday;
    my $isdst;
    my $tt;
    my $null="";
    
    
    # 読み込み書き込みファイルオープン
    #                読み取り 書き込み 追加 新規作成 上書き 
    #   <   filename ○         ×      ×     ×      × 
    #   >   filename ×         ○      ×     ○      ○ 
    #   >>  filename ×         ○      ○     ○      × 
    #   +<  filename ○         ○      ×     ×      × 
    #   +>  filename ○         ○      ×     ○      ○ 
    #   +>> filename ○         ○      ○     ○      × 
    
    system( `sensors | grep Core >$sens_kari` ) ; # sensorsの結果を仮ファイルに出力
    
    
       open IN,"<",$sens_kari;           # sensors が出力した結果を読み込むため仮ファイルを開く
         LABEL3:   while ($line = <IN>) { ;       # 1行ずつ読み込み
           if ( $line    =~/\d+\.\d+/ ) { ;       # Coreの温度を パターンマッチ ex 38.6
             $ii=$ii+1 ;
             $core_ondo[$ii]=$& ;
           }
         }
       close IN ;
    
    
    
    # ########################### 時刻とデータの印字(ファイルへの出力)
    $tt=time();
    ($sec, $min, $hour, $mday, $mon, $year,
        $wday, $yday, $isdst) = localtime($tt);
    $year=$year+1900;
    $mon=$mon+1;
    
    # ファイルへの出力
    open (LOGFILE,">>$out_file") or die "ERROR output file not open$!\n" ; # 出力ファイルをオープン
    print LOGFILE  $year,"/",$mon,"/",$mday,"   ",$hour,":",$min,":",$sec,"  ",$core_ondo[0]," ",$core_ondo[1]," ",$core_ondo[2]," ",$core_ondo[3],"\n" ;
    
    close LOGFILE ;
    


    2.リアルタイムでウェブからCPU温度をみる

     リアルタイムでウェブから見られるようにしようとしたが、エラーがでる。
    温度を出力する仮ファイルをUSERフォルダーに作ったところ webからはオーナーがwww-dataであるため、パーミッションエラーとなった。 このため、仮ファイルを/tmp/仮ファイルとした。

    webにリアルタイムで出力するperlスクリプトはこちら
    #!/usr/bin/perl -w  
    #               -w ワーニングを出す
    # ~nic/sensors/sensors-realtime.pl
    #  cron で定時で取り込む
    # CPUの温度をHPへ出力する
    # 2018/04/05(水)
    #
    use strict; # 宣言した変数以外を使えなくする
    
    
    my @core_ondo;
    my $temp_ondo;
    my $out_file="/home/USER/sensors/cpu_ondo.txt" ; # 出力ファイル名
    my $sens_kari="/tmp/kari_realtime.txt";     # sensorsの結果を出力する仮ファイル cgiでは
    #                                             ownerが「www-data」でパーミッションエラー
    #                                             /tmp に変更することで書き込み可能となった。
    my $ii=-1 ;
    my $line ;
    
    
    # 時刻出力用
    my $sec;
    my $min;
    my $hour;
    my $mday;
    my $mon;
    my $year;
    my $wday;
    my $yday;
    my $isdst;
    my $tt;
    my $null="";
    
    
    # 読み込み書き込みファイルオープン
    #                読み取り 書き込み 追加 新規作成 上書き 
    #   <   filename ○         ×      ×     ×      × 
    #   >   filename ×         ○      ×     ○      ○ 
    #   >>  filename ×         ○      ○     ○      × 
    #   +<  filename ○         ○      ×     ×      × 
    #   +>  filename ○         ○      ×     ○      ○ 
    #   +>> filename ○         ○      ○     ○      × 
    
    system( `sensors | grep Core >$sens_kari` ) ; # sensorsの結果を仮ファイルに出力
    
    
       open IN,"<",$sens_kari;           # sensors が出力した結果を読み込むため仮ファイルを開く
         LABEL3:   while ($line = <IN>) { ;       # 1行ずつ読み込み
           if ( $line    =~/\d+\.\d+/ ) { ;       # Coreの温度を パターンマッチ ex 38.6
             $ii=$ii+1 ;
             $core_ondo[$ii]=$& ;
           }
         }
       close IN ;
    
    
    
    # ########################### 時刻とデータの印字(ファイルへの出力)
    $tt=time();
    ($sec, $min, $hour, $mday, $mon, $year,
        $wday, $yday, $isdst) = localtime($tt);
    $year=$year+1900;
    $mon=$mon+1;
    
    # ファイルへの出力はしない −−> HPへ出力
    #open (LOGFILE,">>$out_file") or die "ERROR output file not open$!\n" ; # 出力ファイルをオープン
    #print LOGFILE  $year,"/",$mon,"/",$mday,"   ",$hour,":",$min,":",$sec,"  ",$core_ondo[0]," ",$core_ondo[1]," ",$core_ondo[2]," ",$core_ondo[3],"\n" ;
    
    #close LOGFILE ;
    
    
    # ########################### ここからHTML出力へ
    
    print "Content-type: text/html\n\n";
    print <<EOM;
    
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html lang="ja">
    <head>
    	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    	<title>CPUの温度を表示</title>
    </head>
    <body>
    
    サーバーXS36V4のCPU温度の状況(°C)<br><br>
    
    <table align="left">
    <tr><td>年月日</td><td>時刻</td><td> CPU0 </td><td> CPU1 </td><td> CPU2 </td><td> CPU3 </td></tr>
    <tr><td>$year/$mon/$mday</td><td>$hour:$min:$sec</td><td> $core_ondo[0]</td><td>$core_ondo[1]</td><td>$core_ondo[2]</td><td>$core_ondo[3]</td></tr>
    </table>
    
    <br>
    
    </body>
    </html>
    
    EOM
    #  ###################  HTML 出力 ここまで
    

    電子工作へ     HomePage     このページのトップ