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分おきに実行する設定を追加