簡體   English   中英

將過濾后的 redis-cli 輸出保存到文件中

[英]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 緩沖;
  • 或者如果你想要一些權衡並且只需要 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.

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