Ruby1.9 - システムコマンドの出力を受け取る


rubyのスクリプトの中でOSのコマンドを実行して、その出力を受け取りたいって時はこんな感じでいいんだろうか?execとかsystemだと受け取れないよね?とても自信がない。


たとえばpingを実行して、出力の中からレスポンスタイムを抜き出して返したいみたいな。一応、失敗したらもう一度試みて、それでも駄目なら0を返す感じにしてみた。

#-*- coding: UTF-8 -*-

def ping(host, limit = 2)
  return 0 if limit == 0
  cmd = "ping -c 1 #{host}"
  begin
    io = IO.popen(cmd)
  rescue
    raise
  else
    response_time = ''
    io.read.gsub(/\n/, '').gsub(/^.*time=(.*?)\s.*/){response_time = $1}
    if response_time.empty?
      ping(host, limit - 1)
    else
      response_time
    end
  ensure
    io.close if io
  end
end

ping('192.168.0.1')       #=> "0.271"