我有一个循环,它会随着日志文件的增长而跟踪日志文件,搜索模式并对其做出反应。问题是我在一个缓冲循环的地方遇到一个延迟输入,我认为这是由于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
吗?
答案 0 :(得分:3)
答案如下:
如果我从重定向的stdin中删除
grep $pattern
,则文件为 按预期处理。
grep
缓冲导致延迟的输出。使用--line-buffered
的{{1}}选项禁用缓冲。
引自grep
:
man grep
答案 1 :(得分:1)
尝试向grep添加行缓冲:
... grep --line-buffered $pattern ...