
さて、計画停電(輪番停電)だが、最近行われない。気候に助けられている部分もあり、気を許すと夏にひどい目にあうかもしれない。
これまで次のようにしてきた:
- UPS をApcupsd で監視・ネットワーク共有し、
- 定義した停電状態(瞬電や短い時間の停電はUPS で乗り切る)に達したらVMware やその他の端末を自動的に安全に終了し、
- UPS をシャットダウンし、復電を待つ
- 復電したら、定義した充電状態(バッテリーの充電が浅いと機器が起動したときにUPSが落ちるかもしれないから)になるまで待機し、
- 安全に起動できる状態になったらUPS を起動し、
- telnet でRT57i を再起動し、
- 起動した旨を管理者に通達し、
- DDNS を更新する
復電した際の起動順序もあるのだろうが、様々ある機器のうち RT57i だけが復帰できなかったから telnet で強制的に再起動させていたが、その後のテストで telnet すら受け付けない状態になることがあるのを発見した。
この状態でも、RT57i はシリアル接続は生きていることがわかったから、RS232-C ケーブルでを接続、USB 変換してWindows 端末からハイパーターミナルもしくはTeraTerm で再起動させることに成功した。(変換ケーブルはこれが使えた)
今度はこれをLinux(Ubuntu)が自動的に行うようにしなければならないし、ネットワークが正常なのかどうかも判定させなければならない。
スポンサードリンク
期待する動作は次のとおり:
- 起動時かcron で周期的にRT57i にネットワーク通信ができるか試みる
- 通信が確立できないときはシリアル通信を開始してRT57i を再起動させる
ネットワーク通信ができるかの判定
まず、RT57i の状態。停電から復帰すると、なぜか電源のOn/Off が必要になる。この時、RT57i に設定してある 192.168.100.1 と通信できないが、シリアル通信はできる。
今までtelnet で再起動させていたが、RT57i に接続できないからネットワーク経由では何も出来ない。できないときに限ってシリアル通信で再起動させるわけだから、「通信できるか」と「再起動」を分けて考える必要がある。
いろいろ探してみた結果、次のコマンドが良さそう。
ping -w 1 $ip | grep ‘パケット損失 100%’ > /dev/null && echo $ip && echo $ip | mail -s ‘ALERT server down!!’ < Your mail address >
(「Kozupon.com – 簡単サーバ監視シェル「監視君」の利用!」より引用)
検証スクリプト
rt57i-net.sh
#!/bin/sh
echo "---------------------------------"
echo " RT57i Restarter for Serial port"
echo "---------------------------------"
# init
addr=192.168.100.100
#addr=192.168.100.111
# ping check
ping_check(){
ping -w 1 $addr | grep '100% packet loss'>/dev/null && return 1
return 0
}
#
# main
#
echo " - pinging..."
ping_check
if [ $? = 1 ]
then
echo " - Network Status [ FAIL ]"
`kermit rt57i-s2.macro`
else
echo " - Network Status [ O K ]"
fi
exit 0
テスト
$ sh rt57i-net.sh
これを起動時やcron で実行させれば問題解決となるかな。。。
※機器の起動順序を云々するなら、インテリジェントなUPS などを使うと制御できるが…¥
※この手の不具合は再現させるのが難しい。一発勝負的な要素も…。
参考文献
- UNIXの部屋 コマンド検索:戻り値 (*BSD/Linux)
- Kozupon.com – 簡単サーバ監視シェル「監視君」の利用!
- UNIXシェルスクリプトメモ(Hishidama’s UNIX shell script Memo)


コメント