k-yamadaのブログ

プログラミングのメモ

rubyのPTY.spawnで処理が止まる場合の対処法

参考:http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/33544?help

○対策
1. PTY.spawn の直後に、wf.sync=true のおまじないを唱えておく
あるいは、
2. wf.print の直後(or 止まっては困る場所より前)に、wf.flush を入れる

修正前

PTY.spawn(cmd) do |r, w|
  w.sync = true
  puts exp = r.expect(/[Pp]assword.*:.*$/)  # <--ここで止まってた。

修正後

PTY.spawn(cmd) do |r, w|
  w.sync = true
  w.flush # 追加
  puts exp = r.expect(/[Pp]assword.*:.*$/)  # <--止まらなくなる