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