我正在尝试编写一个ruby脚本来过滤尾文件(tail -f log.log | ./my_filter.rb
)的输出。我相信我已经将stdin和stdout设置为可以同步读取,但是我仍然看到我的输出以延迟批处理的方式输出,一次输出20条左右,而不是实时输出。
我可以用简单的代码重现问题:
#!/usr/bin/ruby
$stdout.sync = true
$stdin.sync = true
ARGF.each do |line|
puts line
end
我是否缺少消除缓冲的设置,或者类似的东西?
Edit:澄清一下,如果我只是tail -f
日志,那么我看到每秒写入许多行。
[如果要处理文件,则可能需要IO#fsync,它表示:
立即将ios中的所有缓冲数据写入磁盘。请注意,fsync与使用IO#sync =有所不同。后者可确保从Ruby的缓冲区中清除数据,但不能保证底层操作系统实际上将其写入磁盘。
[如果您仅处理标准输入和输出,则还可以尝试要求io/console来查看是否使用IO::console#ioflush是否可以提供所需的行为。该文档说:
刷新内核中的输入和输出缓冲区。 您必须要求“ io / console”才能使用此方法。
作为示例,请考虑:
require 'io/console'
ARGF.each do |line|
$stdout.puts line
$stdout.ioflush
end
这是一个旧问题,但是接受的答案不能完全回答问题恕我直言。
您可以将$stdout.sync = true
放在程序的开头,以将同步输出输出到stdout(如果需要,请添加require 'io/console'
。