うちは、サーバーが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"