最小化缓冲管道,延迟bash中的循环处理

时间:2013-10-15 14:57:24

标签: bash shell loops redirect pipe

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

不起作用

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

我已将$logfile设置为fifo并且必须cat realfile.log > $logfile 3或4次(realfile.log为~2K行),然后缓冲区似乎已填充并且行是通过循环立即处理

如果我从重定向的stdin中删除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吗?

2 个答案:

答案 0 :(得分:3)

答案如下:

  

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

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

引自grep

man grep

答案 1 :(得分:1)

尝试向grep添加行缓冲:

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