29 January 2008

Linuxサーバ、温度上昇したら自動シャットダウン

Linuxサーバのファンが停止したり、なんらかの異常が発生して温度が上昇しすぎる時がある(かもしれない)。
真夏の40℃くらいある室内に置いているサーバを保護するため、自動的にシャットダウンするスクリプトを設置した。

lm_sensors サービスが既に組み込まれているものと仮定している。

/home/prog/hightemp-shutdown.pl
#!/usr/bin/perl # init temperature value $sCpuTemp = 0; $sSysTemp = 0; # get current date and time ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); $mon = $mon + 1; $year = $year + 1900; # ********** # get CPU/System temperature # ********** open(fi, "/usr/bin/sensors |"); ← 実行結果を取り込む while($sLine = <fi>) { if($sLine =~ /CPU Temp/) { ← 温度の部分のみ抜き出す処理 @sItem = split(/ /, $sLine); $sItem[3] =~ s/\+//g; $sItem[3] =~ s/[^0-9+\.].*//g; $sCpuTemp = $sItem[3]; } if($sLine =~ /SYS Temp/) { @sItem = split(/ /, $sLine); $sItem[3] =~ s/\+//g; $sItem[3] =~ s/[^0-9+\.].*//g; $sSysTemp = $sItem[3]; } } close(fi); # ********** # check temperature is high or not # ********** if(($sSysTemp < 40) && ($sCpuTemp < 40)) { exit(); } # ********** # write to log file # ********** open(fo, ">> /var/log/temperature.log"); ← ログファイルに追記 print(fo "[$year-$mon-$mday $hour:$min:$sec] CPU: $sCpuTemp System: $sSysTemp\n"); close(fo); # ********** # check temperature is high or not # ********** if(($sSysTemp < 50) && ($sCpuTemp < 55)) ← 本体50℃、CPU 55℃越えたら… { exit(); } # ********** # shutdown this server # ********** system("/sbin/shutdown -h now"); ← シャットダウン コマンド実行


root でログインして、次のコマンドを実行すると cron の設定ファイルを編集できる

[root@localhost ~]# crontab -e

/etc/crontab ファイルでは無く、こちらのファイルが変更される(fedoraでは正式な方法とされている)

/var/spool/cron/root
@reboot /usr/sbin/fancontrol &> /var/log/fancontrol & */2 * * * * /home/prog/hightemp-shutdown.pl ← 2分おきに実行する設定を追加