[英]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.