herokuからpingできない

ruby2.0.0

herokuで動いているRailsから、任意のホストにpingを送っているのだけど、herokuからだと失敗してる。
ローカルからは成功してるし、実際ホストは生きてる。

heroku consoleから叩いてみた。

$ heroku run rails console
Running `rails console` attached to terminal... up, run.5010
Loading production environment (Rails 4.0.0)
irb(main):001:0> require 'net/ping'
=> false
irb(main):002:0> addr = 'google.co.jp'
=> "google.co.jp"
irb(main):003:0>  
irb(main):004:0* pinger = Net::Ping::External.new(addr)
=> #<Net::Ping::External:0x007f4ae588e910 @host="google.co.jp", @port=7, @timeout=5, @exception=nil, @warning=nil, @duration=nil>
irb(main):005:0> pinger.ping?
=> false
irb(main):006:0> pinger
=> #<Net::Ping::External:0x007f4ae588e910 @host="google.co.jp", @port=7, @timeout=5, @exception="No such file or directory - ping", @warning=nil, @duration=nil>

失敗している理由は、

No such file or directory - ping

となっている。

Gemfileのグローバルにgem 'net-ping'を書いている。

herokuのrubyのバージョン調べた

$ heroku run 'ruby -e "puts RUBY_VERSION"'
Running `ruby -e "puts RUBY_VERSION"` attached to terminal... up, run.5180
2.0.0

成功しているローカルと同じ2.0.0。

次のメソッドでも同じっぽいけどだめだった。

irb(main):005:0> a = Net::Ping::TCP.new("google.co.jp")
=> #<Net::Ping::TCP:0x007f035e4af520 @host="google.co.jp", @port=7, @timeout=5, @exception=nil, @warning=nil, @duration=nil>
irb(main):006:0> a.ping
=> false
irb(main):007:0> a
=> #<Net::Ping::TCP:0x007f035e4af520 @host="google.co.jp", @port=7, @timeout=5, 
@exception=#<#<Class:0x007f035e7c33b0>: execution expired>, @warning=nil, @duration=nil>



ここの記事によると
http://okwave.jp/qa/q5986653.html

pingは、実装が適当だったため削除されている。
代替手段は、
・ システムのpingコマンドをKernel.systemで利用する
・ 開いているtcp portを特定できるなら、TCPSocketで開いてみて例外を捕えてみる。
とのこと。

herokuからpingを使えるかやってみた。

irb(main):009:0> system("ping -n 1 'google.com'")
sh: ping: not found

アカン


まとめると
RubypingはICMPプロトコルを使っていない。
Herokuからはpingをうてない。