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
アカン