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不会在输出流发生时提供对它们的访问权限。