以下代码简化了我目前的情况。我有一个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
调用或不使用它)都不起作用-输出只是空的。