【问题标题】:Saving filtered redis-cli output to a file将过滤后的 redis-cli 输出保存到文件
【发布时间】:2021-12-09 23:30:44
【问题描述】:

我正在尝试查找刷新缓存的时间和方式,计划为此使用命令redis-cli monitor | grep -iE "del|flush" > redis_log.txt,但由于某种原因文件为空。如果我使用没有> redis_log.txt 部分的命令 - 它会在终端中显示正确的输出,如果我使用redis-cli monitor > redis_log.txt 命令 - 它还会将实际输出保存到文件中,但一起失败,只会创建一个空文件。有没有人遇到过类似的问题?

【问题讨论】:

  • 试试redis-cli ... > redis_log.txt 2>&1,也可能是缓冲的问题。

标签: bash redis output monitoring redis-cli


【解决方案1】:

正如 cmets 中提到的,您注意到的问题肯定来自应用于 grep 命令的 I/O 缓冲,尤其是当它的标准输出未附加到终端,而是重定向到文件左右时。

更准确地说,参见例如this nice blog article 以本文结尾:

以下是通常设置缓冲的方式:

  • 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"

总结

最后作为suggested @jetchisel,您可能还希望将STDERR 重定向到您的日志文件,以免错过一些错误消息……因此,例如:

redis-cli monitor | stdbuf -o0 grep -iE "del|flush" > redis_log.txt 2>&1

【讨论】:

  • 添加“--line-buffered”就可以了,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 2020-12-29
  • 2016-02-28
  • 1970-01-01
  • 2016-05-23
相关资源
最近更新 更多