デフォルトルートへPingする

うちは、サーバーがPPPoEルーターを兼務しているのですが、稀にPCI-Expressx1に刺してあるGbEカードが落ちることがあります。

で、「GoogleからのHTTPが3回帰ってこなかったらservice network restartして、それでもだめならシステム再起動するスクリプト書いたよー」ってmixiに書いたら、「デフォルトルートにICMP Ping打つのが妥当ではないか?」(意訳)とのコメントが。

なんかよくわかってないけど、とりあえずこれでいけました。事前に gem install net-ping しておく必要があります。
デフォルトルートの取得方法はもっといい方法がある気がします。誰か教えて。

#!/usr/bin/ruby

require 'net/ping'

addr = /^([\d\.]+)/.match(`netstat -r | grep ppp0 | grep -v default`)[1]
if addr
  pinger = Net::PingICMP.new(addr)
  
  if pinger.ping?
    puts "reached!"
  else
    puts "unreached!"
  end
else
  puts "cannot get route addr"
end

おまけ:アニメ録画システム foltia が録画・トランスコード中または10分以内に録画が始まる番組数を返すスクリプト。システム再起動の前にこいつを実行して、戻り値が0以外だったら再起動しないようにしました。

#!/usr/bin/ruby

require "postgres"

recording_count = `ps -ef | grep recwrap | grep -v grep | wc -l`.chomp.to_i

query  = ""
query += " SELECT";
query +=   " count(*)"
query += " FROM";
query +=   " (";
query +=     " SELECT";
query +=       " pid"
query +=     " FROM"
query +=       " foltia_subtitle"
query +=     " INNER JOIN"
query +=       " foltia_tvrecord USING(tid)"
query +=     " WHERE"
query +=       " startdatetime >= " + (Time.now).strftime('%Y%m%d%H%M')
query +=     " AND"
query +=       " startdatetime <= " + (Time.now + (10 * 60)).strftime('%Y%m%d%H%M')
query +=     " AND"
query +=       " foltia_tvrecord.stationid = foltia_subtitle.stationid"
query +=     " ORDER BY"
query +=       " startdatetime"
query +=   " )";
query += " AS t1;";
waiting_count = 0

begin
  conn = PGconn.connect("", nil, "", "", "foltia", "foltia")
  result = conn.query(query)
  if result != nil
    waiting_count = result[0][0].to_i
  end
  conn.close
rescue
  print "-1\n"
  exit -1
end


print waiting_count + recording_count 
print "\n"