停電を検出してNASを自動シャットダウンする

概要

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分おきに起動するようにした。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする