为什么我不期望Ruby STDOUT缓冲?

问题描述 投票:2回答:1

以下代码简化了我目前的情况。我有一个JSON日志源,该源不断获取并用puts写入stdout。

#!/usr/bin/env ruby

require "json"

loop do
  puts({ value: "foobar" }.to_json)
  sleep 1
end

我希望能够将此脚本的输出通过unix管道通过管道传输到jq进行进一步处理,但以“流”友好的方式进行。像这样运行上面的代码:

./my_script | jq

导致输出为空。但是,如果在exit调用之后放置sleep语句,则输出将按预期通过管道发送到jq。通过在$stdout.flush调用之后调用puts,我能够解决此问题。虽然现在可以正常工作,但我不确定为什么。 $stdout.sync默认设置为true(请参阅IO#sync)。在我看来,如果启用了同步,则Ruby应该不进行输出缓冲,并且不需要调用IO#sync-确实如此。

我的后续问题是关于使用$stdout.flush而不是tail。在我看来,我应该能够像将文本流输送到jq一样,将文本流输送到tail中,但是两种方法(使用jq调用或不使用它)都不起作用-输出只是空的。

ruby pipe stdout jq
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.