Ruby 从子进程连续读取标准输出和标准输出

Ruby 从子进程连续读取标准输出和标准输出,ruby,linux,Ruby,Linux,我使用IO.popen启动子流程,但我只得到子流程退出时运行子流程所需时间(有时为5分钟或其他时间)内发生的所有事情的结果。我真的需要能够在发生时看到子流程写入stderr和stdout的所有内容 到目前为止,我找不到任何类似的方法,但我相信这是可能的。如果您需要实时获取输出,我建议使用stdlibPTY而不是popen 大概是这样的: require 'pty' cmd = 'echo a; sleep 1; cat /some/file; sleep 1; echo b' PTY.spaw

我使用
IO.popen
启动子流程,但我只得到子流程退出时运行子流程所需时间(有时为5分钟或其他时间)内发生的所有事情的结果。我真的需要能够在发生时看到子流程写入
stderr
stdout
的所有内容


到目前为止,我找不到任何类似的方法,但我相信这是可能的。

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

通过这种方式,您可以立即获得输出,就像您可能希望从标准库中使用的终端一样,它允许以流的形式访问stdin、stdout和stderr。

Ps:我发现stdout是缓冲的,stderr不是。请注意这一点。Open3.popen3不会在输出流发生时提供对它们的访问权限。