Heartbeat
「不可解な現象に悩まされ…。」
古いマシンに FreeBSD 6.0 をインストールしたんだけれども、突然、ネットワークがダメになっちゃうと云う不可解な現象が起こっている。外からアクセスできないだけでなく、そのマシンから外へは ping も飛ばない。原因追及には時間がかかりそうだけど、設置場所が離れているので、とにかくリモートからアクセスできる状態を回復しなきゃならない。で、ルーターへ ping を飛ばして、反応がなければリブートするプログラムを書いて、cron に仕込んでおこうかと…。
#!/usr/bin/env ruby require 'ping' class Heartbeat def initialize(host) @machine = 'Arsenal' @alive = true @time = Time.now Ping.pingecho(host, 6) @alive = false if Time.now - @time > 5 end def alive? return @alive end def message msg = @alive ? "alive" : "not alive" return "#@machine is #{msg}. (#@time)" end end obj = Heartbeat.new('192.168.0.12') puts obj.message
ping の動作が期待した動作と違ったので、少々戸惑ってしまった。timeout を仕掛けたりもしたんだけど、ping がシステムコールを呼んでるみたいで、マルチスレッドがうまく機能しないので、時間差を測る方法で。後は、obj.alive? で状況を見て、リブートしてやればいいはず。
クラス名が不適切なのが気になるところ…。ping が一番近いような気もするけど、自分のネットワークが動いているかどうかを確認するためのものだから、ping ってのもちょっと違う。まあ、また、いい名前を思いついたら、修正すればいいや。