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 ってのもちょっと違う。まあ、また、いい名前を思いついたら、修正すればいいや。