以下のコードはMac OS X上だと上手く動きますが、Linux上だと
Errno::EIO: Input/output error @ io_fillbuf というエラーが起きます。

require 'pty'
PTY.spawn("ls") do |r,w,pid|
    until r.eof? do
      puts r.readline
    end
end

どうやら、読み込んだ際にBSDだとnilになりますが、GNU/LinuxだとErrno::EIOが発生する仕様らしいです。

Ruby on Linux PTY goes away without EOF, raises Errno::EIO
にあるように、resqueするSafePtyを作ることで回避できます。

このエントリーをはてなブックマークに追加