6

私はIO.popenサブプロセスを開始するために使用していますが、サブプロセスが終了するときにサブプロセスの実行にかかった時間(場合によっては5分など)で発生したすべての結果のみを取得します。stderr私は本当に、サブプロセスが書き込むすべてのものと、それが発生したときの状態を確認できる必要がありますstdout

これまでのところ、このように機能するものは見つかりませんでしたが、可能であると確信しています。

4

2 に答える 2

7

PTYリアルタイムで出力を取得する必要がある場合は、代わりにstdlibを使用することをお勧めしますpopen

このようなもの:

require 'pty'

cmd = 'echo a; sleep 1; cat /some/file; sleep 1; echo b'
PTY.spawn cmd do |r, w, pid|
  begin
    r.sync
    r.each_line { |l| puts "#{Time.now.strftime('%M:%S')} - #{l.strip}" }
  rescue Errno::EIO => e
    # simply ignoring this
  ensure
    ::Process.wait pid
  end
end
exit "#{cmd} failed" unless $? && $?.exitstatus == 0

> 33:36 - a
> 33:37 - cat: /some/file: No such file or directory
> 33:38 - b

このようにして、ターミナルと同じように、即座に出力を取得します

于 2012-11-23T09:00:52.643 に答える
0

標準ライブラリのOpen3.popen3を使用すると、stdin、stdout、およびstderrにストリームとしてアクセスできます。

于 2012-11-23T09:19:49.620 に答える