我有以下方法,想法是运行一个shell命令,并将两个流输出到stdout作为其收到并将信息存储为变量,这样我就可以返回信息的哈希值,我发现没有标准的做法这(你得到流式传输或捕获输出)。
这是通过创建一个for来流输出并附加到我可以在以后读入的IO管道来实现的。
def self.run_cmd(cmd)
stdout_rd, stdout_wr = IO.pipe
stderr_rd, stderr_wr = IO.pipe
status = Open4::popen4(cmd) do |_pid, _stdin, _stdout, _stderr|
pids = []
pids << fork do
_stdout.each_line do |l|
print l
stdout_wr.puts l
end
end
pids << fork do
_stderr.each_line do |l|
print l
stderr_wr.puts l
end
end
pids.each{|pid| Process.waitpid(pid)}
end
stdout_wr.close
stderr_wr.close
out = stdout_rd.gets
out = '' if out.nil?
err = stderr_rd.gets
err = '' if err.nil?
{ stdout: out, stderr: err, status: status.exitstatus }
end
这在大多数情况下效果很好,但具体来说unzip
并没有很好地配合这种方式,所发生的事情是在zip的固定数量的输出之后它会停留在stdout_wr.puts l
我观察到当ruby进程停止运行ps
有什么方法可以让我的工作吗? 有没有更好的方法呢?我很欣赏它是一个复杂的解决方案,它必须更容易。
我的潜在想法是我的IO管道没有缓冲空间,但我能够毫无问题地打印10,000行输出。