2013-10-15 21 views
1

我有一个循环,随着它的增长,它将跟随一个日志文件,寻找一个模式并对其作出反应。问题是我在某个地方打了一个缓冲区,导致输入循环延迟,我相信这是由于tail -f和管道日志到grep最大限度地减少在bash中延迟循环处理的缓冲管道

不工作

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) 

难道tailfsync()'ing-f写操作?

+1

http://stackoverflow.com/questions/972370/how-do-you-pipe-in​​put-通过grep-to-another-utility – Iain

+0

lain,在我的搜索中没有看到。 – mmlb

回答

3

答案就在下面:

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

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

man grep引用:

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

D'oh应该有grep的RTFM,而不是尾巴! – mmlb

1

尝试增加行缓冲到的grep:

... grep --line-buffered $pattern ... 
+0

谢谢,我接受@ devnull的更完整一点。 – mmlb

相关问题