smartctl+sensor+rrdtool+cactiで温度のグラフ化

参考:
smartctlからHDD温度抽出するperl(のヒント)
http://www.aconus.com/~oyaji/suse/mrtg_suse_th.htm
sensorsからCPU温度抽出するperl(の正規表現
http://okkun-lab.rd.fukuoka-u.ac.jp/wiki/?Tips%2FLinux%2FMRTG
cactiへの登録
http://cacti.loaded.jp/

折角なのでできあがったスクリプトを誰かのために(自分のために?)記しておく。
注意:これはPentiumDC(E6300)とシリアルHDD4台を想定しています。

#/usr/bin/perl
# for rrdtool+cacti

$smart=`/usr/sbin/smartctl -A /dev/sda | grep Temperature_Celsius`;
if($smart =~ /Temperature_Celsius(.*?)0x(\d+)(.*?)(\d+)(.*?)(\d+)(.*?)(\d+)(.*?)(\d+)/){
$sdaTemp = $10;
}

$smart=`/usr/sbin/smartctl -A /dev/sda | grep Temperature_Celsius`;
if($smart =~ /Temperature_Celsius(.*?)0x(\d+)(.*?)(\d+)(.*?)(\d+)(.*?)(\d+)(.*?)(\d+)/){
$sdbTemp = $10;
}

$smart=`/usr/sbin/smartctl -A /dev/sda | grep Temperature_Celsius`;
if($smart =~ /Temperature_Celsius(.*?)0x(\d+)(.*?)(\d+)(.*?)(\d+)(.*?)(\d+)(.*?)(\d+)/){
$sdcTemp = $10;
}

$smart=`/usr/sbin/smartctl -A /dev/sda | grep Temperature_Celsius`;
if($smart =~ /Temperature_Celsius(.*?)0x(\d+)(.*?)(\d+)(.*?)(\d+)(.*?)(\d+)(.*?)(\d+)/){
$sddTemp = $10;
}

$sensors=`/usr/bin/sensors | grep Core`;
@row=split(/\n/, $sensors);
if($row[0] =~ /Core 0:\s+[+-\s]([\d\.]+)/){
$core0Temp=$1;
}
if($row[1] =~ /Core 0:\s+[+-\s]([\d\.]+)/){
$core1Temp=$1;
}
print "core0Temp:$core0Temp core1Temp:$core0Temp sdaTemp:$sdaTemp sdbTemp:$sdbTemp sdcTemp:$sdcTemp sddTemp:$sddTemp";

実行例:(改行されません)

[root@serv2 ~]# perl getTemp.pl
core0Temp:33 core1Temp:33 sdaTemp:20 sdbTemp:20 sdcTemp:20 sddTemp:20[root@serv2 ~]#

ついでに:

[root@serv2 ~]# sensors
coretemp-isa-0000
Adapter: ISA adapter
Core 0: +33°C (high = +100°C)

coretemp-isa-0001
Adapter: ISA adapter
Core 1: +33°C (high = +100°C)

[root@serv2 ~]#