我正在使用IO.popen启动一个子流程,但是我只能得到该子流程退出时该子流程运行所花费的时间(有时5分钟左右)中发生的所有结果。我真的需要能够看到子进程在发生时随即写入stderrstdout的所有内容。

到目前为止,我找不到任何能像这样的东西,但是我敢肯定这是可能的。

最佳答案

如果您需要实时获取输出,我建议您使用stdlib PTY而不是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

这样,您可以立即获得输出,就像在终端中一样

关于ruby - ruby -从子进程连续读取STDOUT和STDERR,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13525603/

10-13 04:35