我正在使用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
通过这种方式,您可以立即获得输出,就像在终端中一样
您可能希望使用标准库中的 Open3.popen3,它允许以流的形式访问 stdin、stdout 和 stderr。