*[PC]HDL4-G UPSトラブル暫定対応

UPSを接続しているとたまにHDL4-G起動時イベントトリガによって
延々と/sbin/hotplugがcallされ最終的にハングアップしてしまうトラブル。

正常にapcupsdが起動できないときに発生する。


ps ax|grep apc
2579 ? Ds 0:00 /sbin/apcupsd
2621 ? S 0:00 /sbin/apcupsd
2622 ? S 0:00 /sbin/apcupsd
2623 ? S 0:00 /sbin/apcupsd
2875 pts/0 S+ 0:00 grep apc


ps ax|grep apc
2580 ? Ds 0:00 /sbin/apcupsd
4642 pts/0 S+ 0:00 grep apc


apcupsdが異常の時には通常4つあるプロセスが1つしかない。
しかもkill -9できないのでにっちもさっちもいかないという。(汗)

google検索してみるとSTAT Dは割り込み不可スリープ状態で
killコマンドを受け付けない。対応はrebootのみだとか。

スキルがあればapcupsdのソース読んで対応策を探るのだろうが自分には無理!
後考えられるとしたらapcupsdのバージョンアップだろうか。

とりあえず暫定対応として上述の状況に陥った際、自分でリブートするようにした。

ブートシーケンス途中でshutdownコマンドを発行するのが不安なのと
/sbin/hotplugがブートシーケンス途中でコールされるのもイヤなので
sysctl.conf含めての対応。
ちょっと大がかりになってしまった。

1./sbin配下に何もせず抜けるシェルスクリプト作成
/sbin/hotplug.exit
#!/bin/sh
exit 0

2.sysctl.confにhotplug.exitをハンドラとして登録
/etc/sysctl.conf
#ホットプラグハンドラ
kernel.hotplug=/sbin/hotplug.exit

3./sbin/hotplugにリブート制御を追加。
/sbin/hotplug
if [ $1 == 'usb' ]; then
if [ "$TYPE" == '' -a "$INTERFACE" == '' -a "$PRODUCT" == '' ] ; then
exit 0
fi
if [ "$TYPE" == '0/0/0' -a "$INTERFACE" == '3/0/0' -a "$PRODUCT" == '764/501/1' ] ; then
sysctl -w kernel.hotplug=/sbin/hotplug.exit
logger APCUPSD Holted.
/usr/local/bin/HDLsystem --reboot
exit 0
fi
fi

4./etc/init.d/rc.local末尾にホットプラグハンドラ変更を追加
sysctl -w kernel.hotplug=/sbin/hotplug


これでブートシーケンス中はダミーハンドラ(/sbin/hotplug.exit)で
イベントを捨ててブート最後にハンドラを戻しUPS異常時のイベントが
発生していれば即座に/var/log/messagesにメッセージ出力し再起動。

再起動有無はHDL4-GのSYLOGメール機能で通知するようにした。

大抵は1回の再起動で無事認識するが多いと3回ほど再起動することもある。
再起動にはおおよそ5分ほどかかる。


やっつけの対応だが自分のスキルじゃ今はこれが限界。