2

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

不工作

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

我已经设置$logfile为 afifo并且必须进行cat realfile.log > $logfile3 或 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吗?

4

2 回答 2

4

答案如下:

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

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

引自man grep

   --line-buffered
          Use  line  buffering  on  output.   This can cause a performance
          penalty.
于 2013-10-15T15:24:57.040 回答
1

尝试将行缓冲添加到 grep :

... grep --line-buffered $pattern ...
于 2013-10-15T15:25:10.607 回答