[英]Saving filtered redis-cli output to a file
我正在嘗試查找何時以及如何刷新緩存,計划使用命令redis-cli monitor | grep -iE "del|flush" > redis_log.txt
redis-cli monitor | grep -iE "del|flush" > redis_log.txt
,但由於某種原因該文件為空。 如果我使用沒有> redis_log.txt
部分的命令 - 它在終端中顯示正確的輸出,如果我使用redis-cli monitor > redis_log.txt
命令 - 它也會將實際輸出保存到文件中,但它一起失敗,只有創建一個空文件。 有沒有人遇到過類似的問題?
正如評論中提到的,您注意到的問題肯定來自應用於grep
命令的 I/O 緩沖,尤其是當其標准輸出未附加到終端,而是重定向到文件左右時。
更准確地說,請參閱例如這篇不錯的博客文章,它以這個總結結束:
以下是通常設置緩沖的方式:
- STDIN 總是被緩沖的。
- STDERR 從不緩沖。
- 如果 STDOUT 是終端,將自動選擇行緩沖。 否則,將使用塊緩沖(可能是 4096 字節)。
[…] 這 3 點解釋了所有“奇怪”的行為。
為了調整程序的 I/O 流緩沖,coreutils 提供的一個非常方便的程序是stdbuf
。
所以對於你的用例:
grep -iE "del|flush"
替換為:stdbuf -o0 grep -iE "del|flush"
完全禁用 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.