簡體   English   中英

最小化延遲bash中循環處理的緩沖管道

[英]Minimizing buffered pipe that delays loop processing in bash

我有一個循環,它將隨着日志文件的增長而跟蹤日志,搜索模式並對它做出反應。 問題是我在某個地方打了緩沖區,延遲了獲取輸入的循環,我相信這是由於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進行寫操作嗎?

答案如下:

如果我從重定向的stdin中刪除grep $pattern ,則按預期處理文件。

grep緩沖導致延遲的輸出。 grep使用--line-buffered選項可禁用緩沖。

引用man grep

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

嘗試將行緩沖添加到grep:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM