连续从子进程读取STDOUT和STDERR

时间:2012-11-23 08:48:30

标签: ruby linux

我使用IO.popen来启动子进程,但是我只得到子进程退出时所发生的所有事情的结果(有时是5分钟或其他) 。我真的需要能够看到子进程写入stderrstdout的所有内容,以及发生的时间。

到目前为止,我找不到任何类似的功能,但我确信它是可能的。

2 个答案:

答案 0 :(得分:7)

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

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

中一样

答案 1 :(得分:0)

您可能希望使用标准库中的Open3.popen3,它可以将stdin,stdout和stderr作为流进行访问。