【问题标题】:Minimizing buffered pipe that delays loop processing in bash最小化在 bash 中延迟循环处理的缓冲管道
【发布时间】:2013-10-15 14:57:23
【问题描述】:

我有一个循环,它会随着日志文件的增长而跟踪它,搜索模式并对其做出反应。问题是我在某个地方遇到了一个缓冲区,该缓冲区延迟了循环获取输入,我相信这是由于tail -f 并将日志传送到grep

不起作用

while read l; do echo "l = |$l|"; done < <(tail -f $logfile | grep $pattern)

我已将 $logfile 设置为 fifo 并且必须 cat realfile.log &gt; $logfile 3 或 4 次(realfile.log 约为 2K 行),然后缓冲区似乎已填满并立即处理这些行 通过循环。

如果我从重定向的标准输入中删除 grep $pattern,文件将按预期处理。

有效

while read l; do echo "l = |$l|"; done < <(tail -f $logfile)

也有效

while read l; do echo "l = |$l|"; done < <(tail $logfile | grep $pattern)

tail不是fsync()'ing-f上的写吗?

【问题讨论】:

标签: bash shell loops redirect pipe


【解决方案1】:

答案如下:

如果我从重定向的标准输入中删除grep $pattern,则文件为 按预期处理。

grep 缓冲导致延迟的输出。使用grep--line-buffered 选项禁用缓冲。

引用man grep:

   --line-buffered
          Use  line  buffering  on  output.   This can cause a performance
          penalty.

【讨论】:

  • D'oh 应该有用于 grep 的 RTFM,而不是 tail!
【解决方案2】:

尝试在 grep 中添加行缓冲:

... grep --line-buffered $pattern ...

【讨论】:

  • 谢谢,我接受@devnull's,因为它更完整一些。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
  • 2016-05-11
相关资源
最近更新 更多