6

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

到目前为止,我找不到任何像这样工作的东西,但我相信这是可能的。

4

2 回答 2

7

如果您需要实时获取输出,我建议使用 stdlibPTY而不是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,它可以访问标准输入、标准输出和标准错误作为流。

于 2012-11-23T09:19:49.620 回答