basyura's blog

あしたになったらほんきだす。

ruby で ping

とある事情により与えられた IP アドレスの一覧から生きているものを抜き出すことになった。一個一個端末を確認して回るのはあり得ないし、ping を打って確認するのもめんどいなぁ・・・と思って

ruby ping

でグーグル先生に聞いたら ruby に ping のライブラリが有ることを教えてくれた。なんでもあるなぁと思いつつロジックをくんでみた。

require 'ping'
Ping.pingecho(address)

これで OK かと思ったら、明らかに生きてるのに false が返ってくるものがある・・・。改めてリファレンスを確認する。

host の TCP サービスserviceに対して接続を試み成功すれば true を返します。ping(1) と異なり ICMP を使用しないので root 権限を必要としない利点があります。
相手から何も返ってこずタイムアウトの場合のみ false を返す。相手からの能動的な接続拒否の場合には true を返す。
注)あなたが接続を許可されていないサーバのサービスに対してこのメソッドを使うのは推奨しない。

Ping

「ICMP」と「接続を許可されていない」がキーワードか?良く分からないので手っ取り早く

ret = `ping -n 1 #{address}`
if ret =~ /Reply/
  # OK な場合
else
  # NG な場合
end

と書いて一覧を作り直した・・・。あとで調べる。