目的
 うちにはサーバ用・ルータ用の2台の常時稼働マシンがある。どちらも基本的にはある程度安定しているのだが、どうしても時々落ちる。特に夏。
 勝手に再起動してくれる分にはまぁ構わないのだが、高温時にハングアップということが希に起こる。こうなると家にいない限り長時間のサーバダウンは避けられないので、これはいただけない。
 そこで、せっかく2台の常時稼働マシンがあるのだから、お互いに定期的にpingを打って無事を確認し、相手の意識がなければ強制的にリセットスイッチを押してやって再起動させ、長時間のサーバダウンを回避する。

製作:ハードウェア
 リセットスイッチを押すといっても物理的にボタンを押すなんて難しいことをするわけではなく、リレー制御ボード RBIO-3Eを用いてマザーボードのリセットスイッチを短絡させる。
 まず、リセットするときだけ短絡すればいいので、RBIOのリレーのNO(ノーマルオープン)側から配線を作る。
image
この写真で下から2番目・3番目の端子がそれ。

 そしてこの線の反対側は、
image
マザーボードのリセットスイッチと同じ規格のコネクタを付けてやり、更に並列にピンも付けてやる。
ピンを付けるのは、ここにケースのコネクタを刺すことでケースのリセットスイッチも使えるようにするため。実際には電源ボタンがあるのでこれは作らなくても困らないかもしれない。

 こんなものを適当に作ってしまったせいで、
image
そのへんの金属部に触れるだけでリセットされてしまう危険箇所が出来てしまったので、
image
木工用ボンドで固めてやり、絶縁する。

 これまた乾くまで触ることも出来ないので、
image
なんとか乾燥させてやる。

乾いたら、マザーボードのリセットスイッチのところに刺して、並列のピンにケースのリセットスイッチのコネクタを刺して完成。

製作:ソフトウェア
 次は、このスイッチをON/OFFするスクリプトを書く。
 方向性としては、定期的に相手にpingを打って返事がなければ、ただのしかばねのようなので電気ショックを与えてやるというもの。

○仕様
   ・pingを5発打って全く帰ってこなかったらRBIOでリセット。
     →1発だけだと何だか不安なので、5発打って5発ともダメなときに発動。
   ・無限ループで5分ごとに確認。
     →1分1秒を争うサーバではない。5分5発のpingがしんどいわけでもない。
   ・リセット後は10分待つ。
     →5分で起動しきれなかったら一生リセットしてるから。
   ・自分が起動したときと、相手をリセットしたときにログをとる。
     →気分的な問題で。

○ソース
watch_firewall.php

これを、

/usr/bin/php /home/.../.../rbio/watch_firewall.php &
と、バックグラウンドで走らせてやって、今後も再起動時にこれが走るように
/etc/rc.d/rc.local
に、
/usr/bin/php /home/.../.../rbio/watch_firewall.php &
って1行を付け足してやる。