Information

日記

G-ZONEのメインコンテンツとは関係のない日々を綴ったX-Virusの日記です。メインコンテンツが更新されていない時、X-Virus が何をしているか、ここを読んでもらえれば分かるように・・・というより、自分が何をしようと目論んでいるかといった備忘録として使う予定です。

< 2011 / 3 >


1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

最近の日記

計画停電対策/停電で自動スリープさせる 2011-03-20

東日本大震災の犠牲者の方々にお悔やみを申し上げるとともに、被災された多くの方々に心からお見舞いを申し上げます。

このサーバーは、平均18wという少ない電力で運用しています。節電について配慮して運用していると考えております。東日本大震災の早期の復興を願っております。

東日本大震災に伴う計画停電(輪番停電)にてサーバーにダメージを負わないようにするために、自宅サーバーにて運用しているサーバー管理者の方々は色々と悩み対策を講じていると思います。このサーバーもそうしたサーバーのひとつであり、停電時の対応を考えなければなりませんでした。

現在MacOS X 10.6 Serverで運用していますが、これまで利用していたAPC社製UPS(無停電電源装置)のユーティリティがMacOS X 10.5 までしか対応しておらず、正しく動作しないことが判りました。停電に入ってもサーバが自動でシャットダウンしません。そこで、別の方法を考えました。

UPSは、サーバーにのみ予備電力を供給し、ルーターには予備電力を供給しないようにします。そしてルーターが反応するかを定期的に監視し、もしルーターが無反応ならスリープするようにしました。プログラムは至って簡単で、shシェルスクリプトで書いてあります。

#/bin/sh
ROUTER_IP=192.168.1.1
LOG_FILE_PATH=/var/log/UPS.log
#
LOG_FILE_LINE=`cat $LOG_FILE_PATH | wc -l`
ROUTER_NG=`ping -c 1 -t 1 $ROUTER_IP | grep 100 | wc -l`
if test $ROUTER_NG -eq 1 ; then
	if test $LOG_FILE_LINE -gt 10
		then
		echo 'Can not SLEEP:'`date` >> $LOG_FILE_PATH
	else
		echo SLEEP:`date` >> $LOG_FILE_PATH
		osascript -e 'tell app "Finder" to sleep'
	fi
fi

これを2分に1度実行するようにしました。

MacOS X 10.6 の場合、crontabが無くlaunchを使いますので、launch用にXMLを書きます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>com.ups.sleep</string>
	<key>ProgramArguments</key>
	<array>
		<string>/ファイルを配置したフォルダのパス/UPS.sh</string>
	</array>
	<key>StartInterval</key>
	<integer>120</integer>
</dict>
</plist>

これをシステムの/Library/LaunchDaemons/フォルダ内に適当な名前で保存しますが、このXMLの場合には、com.ups.sleep.plistと命名し、XML内にも記述してあります。

ファイルを作成したら、launchctlを使ってロードします。ロードしないと動作しません。ロードさせるためには、ターミナルから次のように入力します。

sudo launchctl load /Library/LaunchDaemons/com.ups.sleep.plist

ちなみに、すでにロードしているXMLを書き換えるには、ロード前にアンロードをしなければなりません。

sudo launchctl unload /Library/LaunchDaemons/com.ups.sleep.plist

これで2分に一度、ルーターに対してpingを打ち、帰ってきた情報に100% lossの行があれば、ルーターが無反応と見なされてスリープします。スリープからの解除は、APCのUPSの場合にはUPSとサーバーがUSBで接続してあれば、停電からの復帰時にUSBから入力があるので自動的にスリープから解除されます。

この自動スリープが暴走しないようにするために、ログファルに10行以上のログがあると、自動スリープに入らないようにしています。なので停電復帰後は、忘れずにログファイルを空にしないといけません。

これでとりあえず計画停電を乗り切ることにします。