我試圖找到重繪 快取的時間和方式,計劃為此使用該命令redis-cli monitor | grep -iE "del|flush" > redis_log.txt,但由于某種原因,該檔案為空。如果我使用不帶> redis_log.txt部分的命令- 它會在終端中顯示正確的輸出,如果我使用redis-cli monitor > redis_log.txt命令 - 它還會將實際輸出保存到檔案中,但一起失敗,只會創建一個空檔案。有沒有人遇到過類似的問題?
uj5u.com熱心網友回復:
正如評論中提到的,您注意到的問題肯定來自應用于grep命令的 I/O 緩沖,尤其是當其標準輸出未附加到終端,而是重定向到檔案左右時。
更準確地說,請參閱例如這篇不錯的博客文章,它以這個總結結束:
以下是通常設定緩沖的方式:
- STDIN 總是被緩沖的。
- STDERR 從不緩沖。
- 如果 STDOUT 是終端,將自動選擇行緩沖。否則,將使用塊緩沖(可能是 4096 位元組)。
[…] 這 3 點解釋了所有“奇怪”的行為。
通用解決方案
為了調整程式的 I/O 流緩沖,coreutils 提供的一個非常方便的程式是stdbuf.
所以對于你的用例:
- 您可能希望替換
grep -iE "del|flush"為:
stdbuf -o0 grep -iE "del|flush"完全禁用 STDOUT 緩沖; - 或者,如果您想要一些權衡并且只需要 STDOUT 行緩沖,
您可能需要替換grep -iE "del|flush"為:- 要么
stdbuf -oL grep -iE "del|flush", - 或
grep --line-buffered -iE "del|flush"。
- 要么
包起來
最后,正如@jetchisel所建議的那樣,您可能還希望將 STDERR 重定向到您的日志檔案,以免錯過一些錯誤訊息……因此,例如:
redis-cli monitor | stdbuf -o0 grep -iE "del|flush" > redis_log.txt 2>&1
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/334792.html
