トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

ShutdownSwitch

シャットダウンスイッチ

サーバの場合、普段モニターを使用する必要が無いので取り付けていないときが多い。(場合によってはキーボードも外している。)停電などが予定されているがリモートからのログインができない、時間がない、めんどくさい、といった状況の時はローカルで簡単にシャットダウンできる機能が欲しくなる。PCでサーバを仕立てている場合にはシリアルポートとスイッチの組み合わせでシャットダウンスイッチが作れる。(ACPIが機能するなら不要だけど。)

ここで想定する環境
  • ハードウェア: x86系のPC(所謂普通のパソコン)
  • OS: FreeBSD 4系列以降(他のUNIX系にも多分応用できる)
  • シリアルポート: BIOSとOSで少なくとも1つは有効にしておく
  • スイッチ: ここではPCケースのリセットスイッチを乗っ取ることにする
シリアルポート&スイッチの結線

シリアルポートがDsub-9pin の場合、シリアル通信用ケーブルを加工して、1:DCDと4:DTRをリセットスイッチに接続し短絡可能にする。

スイッチングのサージ抑制に抵抗を少し入れておいた方がいいかもしれないが、抵抗が大きすぎると電圧降下でHighロジックが認識できなくなることがある。この辺はPCのマザーボードに依存。

スクリプト

シャットダウンのためのプログラムは至って簡単なシェルスクリプトでOK。montreset.sh

#!/bin/sh
: > /dev/ttyd0
sync
sync
sync
shutdown -p now

syncは1回で良いと思うが慣例(sync for me, sync for you, sync for god)で。shutdownコマンドで-pオプションが効くのはkernelでAPMかACPIが有効なとき。で、このスクリプトが何をしているかというと、ヌルコマンド(:)をシリアルデバイス(/dev/ttyd0)に向けてリダイレクト(>)する。しかし、スイッチOFFの場合、DCDがlowなのでOS側はモデムがOpenになっていないと認識して、Openになるまでひたすらぼ〜っと待ち続ける。そこでリセットスイッチが押されると、DCDはDTR(PC側で通信可能だよ!とモデムに伝えるためにHighになっている)と接続されONになるので、モデムがオープンになったとOSが判断してヌルコマンドに対して返答が行われ、次の処理に進むことができる、という流れ。このスクリプトが起動時に自動的に立ち上がるようにするにはshutwait.sh

 #!/bin/sh
echo 'Shutdown Switch Monitor! '
/usr/local/sbin/montreset.sh &

というスクリプトを/usr/local/etc/rc.d/ に放り込んでおく(FreeBSDの場合)。このようにバックグラウンドでスクリプトを走らせるようにしないと、起動時にモデムオープン待ち状態で止まってしまう。5系列以降はrc.confの設定を参照する起動スクリプトにしたほうがいいかもしれない。これらのスクリプトは実行権限をつけるのを忘れないように。