摆脱ruby stdin / stdout缓冲

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

我正在尝试编写一个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日志,那么我看到每秒写入许多行。

ruby stdout stdin
2个回答
4
投票

[如果要处理文件,则可能需要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

1
投票

这是一个旧问题,但是接受的答案不能完全回答问题恕我直言。

您可以将$stdout.sync = true放在程序的开头,以将同步输出输出到stdout(如果需要,请添加require 'io/console'

© www.soinside.com 2019 - 2024. All rights reserved.