如何解决Redis延迟数据捕获20秒时存入变量即终止的问题?
Redis延迟数据完整捕获方案
问题描述
我需要每日定时更新存储Redis Latency值的文件,目前使用命令redis-cli --latency -h 127.0.0.1 -p 6379,但该命令仅在交互模式下循环输出值。使用timeout 20 /usr/local/bin/redis-cli --latency -h 127.0.0.1 -p 6379可正常运行20秒,但尝试将输出存入变量:
Latency=$(timeout 20 /usr/local/bin/redis-cli --latency -h 127.0.0.1 -p 6379) echo $Latency
时,命令会立刻停止而非运行满20秒,请问如何将Redis延迟数据完整捕获20秒并存入变量?
原因分析
redis-cli --latency会检测输出环境:如果是终端(TTY),就进入循环输出模式;如果是管道或变量捕获(非TTY),则仅输出一次延迟统计就退出,导致timeout还未到时间进程就提前结束。
解决方法
方法1:模拟终端环境捕获输出
用script命令模拟终端会话,让redis-cli保持循环输出状态:
# 捕获20秒内的所有延迟数据到变量 Latency=$(script -q -c "timeout 20 /usr/local/bin/redis-cli --latency -h 127.0.0.1 -p 6379" /dev/null) # 用双引号包裹变量,保留换行输出完整内容 echo "$Latency"
script -q:静默模式,不显示启动/结束提示信息-c:指定要运行的目标命令/dev/null:避免生成额外的日志文件
方法2:使用专门的周期性输出参数
redis-cli提供--latency-history参数,无需终端环境即可周期性输出延迟数据(默认每1秒输出一次):
# 捕获20秒内的延迟数据,每1秒输出一条记录 Latency=$(timeout 20 /usr/local/bin/redis-cli --latency-history -i 1 -h 127.0.0.1 -p 6379) echo "$Latency"
-i:可自定义输出间隔(单位:秒),比如-i 0.5即为每0.5秒输出一次
方法3:直接写入文件(适合定时任务场景)
如果最终目标是将数据存入文件,可跳过变量直接写入,步骤更简洁:
# 直接将20秒内的延迟数据写入指定日志文件 timeout 20 /usr/local/bin/redis-cli --latency-history -i 1 -h 127.0.0.1 -p 6379 > /path/to/redis_latency.log
内容的提问来源于stack exchange,提问作者indayush
相关产品推荐
相关产品推荐

