概要
UPS(無停電電源装置)で電源のバックアップがされている NAS に、停電時に自動でシャットダウンする仕組みを取り入れた。スクリプトによって停電を検出し、自動でシャットダウンするものだ。使っている NAS は Synology のもので、同社が公表している UPS であれば、UPS の発する停電時の信号を受けて自動シャットダウンする機能が標準で備わっている。しかし、UPS が Synology NAS と互換性のない ものや停電時に信号を発する機能がないものであったり、NAS が信号を受ける機能を有していない場合は、電源がバックアップされていてもシャットダウンは手動で行う必要がある。UPS の電源をバックアップできる時間は限られており、留守中など NAS の操作が出来ない時に生じた停電には対応できない。手持ちの UPS には停電信号を発する機能が無い。そこで、スクリプトによって停電を検出し、自動シャットダウンすることにした。
先日、就寝中に発生した落雷による瞬時停電が原因で、NAS の電源が落ちていた。幸いデータの破損はなかったが、NAS のデータ破損を考えると精神衛生上よくない。パソコンで使っていた UPS を NAS で使うことにした。NAS は Synology の DS418 で、UPS は APC ES 425VA である。NAS は停電信号を受けて自動シャットダウンする機能を標準で持っているが、UPS は信号を出す機能がない。手持ちの UPS を何とか使うことが出来ないか WEB を検索し、解決策を見つけた。このサイトの情報を元に、スクリプトを作成して運用をはじめた。
スクリプトの作成
停電検出の仕組みは、ルーターに PING を送出し、応答が無ければ停電中と判断するものだ。作成したスクリプトは次のとおり。
#!/bin/bash IP=192.168.1.1 PING_FILE='/volume1/PRIVATE/script/ping.dat' SWITCH_FILE='/volume1/PRIVATE/script/sw.dat' # Check Switch file if [ -e $SWITCH_FILE ]; then" exit # Exit from Script fi # make switch file echo ' ' > $SWITCH_FILE # ///// Check for power ///// counter=0 while true do ping -w 10 $IP > $PING_FILE PingResult=$(grep '100% packet loss' $PING_FILE) if [ -z "$PingResult" ]; then # $PingResult is blank -> normal rm $SWITCH_FILE # Remove Switch file exit # Exit from Script fi # $PingResult is not blank -> power down counter=$(expr $counter + 1) if [ $counter -lt 5 ]; then echo 2 >/dev/ttyS1 # short Beep sleep 30 # Wait 20 seconds else break # exit from loop fi done echo 3 >/dev/ttyS1 # long Beep sleep 1 echo 3 >/dev/ttyS1 sleep 1 echo 3 >/dev/ttyS1 rm $SWITCH_FILE # Remove Switch file shutdown -h now
(1)ルーターのIPアドレス、一時ファイルを変数に設定する。
(2)多重起動防止のため、SWITCH_FILE が有ればスクリプトを終了する。
(3)SWITCH_FILE を作成して処理中であることを示す。
(4)ループ中で停電を検出する。
・ルーターに ping を送り、ルーターの応答で PING_FILE を作成する。
・PingResult が空白であれば「正常」、空白でなければ「停電」である。
・[ -z “$PingResult” ] が真ならば、SWITCH_FILE を削除してスクリプトを抜ける。
・counter が 5 以下の場合はビープを鳴らし、30秒待つ。
・「停電」の判断が 5回続くとループを抜けて次の処理に移る。
(5)ビープを3回鳴らし、SWITCH_FILE を削除した後、shutdown を実行。
スクリプトの置き場所は NAS のシステムに影響しない /volume1/PRIVATE/script/ とした。これに合わせて PING_FILE・SWITCH_FILE の内容を設定する。スクリプトのデバッグを行う際には、最後の shutdown をコメントアウトし、NAS の LAN ケーブルを抜いてみればブザーが鳴って、スクリプトが実行されていることが分かる。
cron によるスクリプトの起動
ルーターの状態を監視するため、一定時間ごとにスクリプトを起動しなければならない。OS が Linux ならば cron を使って起動すればよい。Synology NAS ではタスクスケジューラーの下で実行される。タスクスケジューラーの設定は、最短で1時間ごとにしか起動できないので、/etc/crontaqb を直接編集して設定する。
MAILTO="" PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/sbin:/usr/syno/bin:/usr/local/sbin:/usr/local/bin #minute hour mday month wday who command */15 * * * * root /volume1/PRIVATE/script/UPS.sh 0 0 29 2,5,8,11 * root /usr/syno/bin/synoschedtask --run id=4 20 0 * * 0 root /usr/syno/bin/synoschedtask --run id=2 0 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 27 11 * root /usr/syno/bin/synoschedtask --run id=6 0 2 * * 0 root /usr/syno/bin/synoschedtask --run id=3 45 22 * * 0,2,4,6 root /usr/syno/bin/synoschedtask --run id=5 40 6 * * 4 root /usr/syno/bin/synoschedtask --run id=1
作成したスクリプト UPS.sh を */15 で 15分おきに起動するようにした。