读取redis-cli订阅的stdout并在消息上运行bash命令

问题描述 投票:1回答:2

我想要一个bash脚本,它读取redis-cli订阅的标准输出,并在收到消息时执行某些操作以及消息值。

订阅可以作为arg传递给redis-cli,就像这样

redis-cli --raw subscribe foo

但后来我需要将stdout传递给某些东西,以便我可以解析这些消息。我想过使用while read line; do循环,但单个redis消息占用3行。

更新

我的最后阶段是通过在etcd上设置一个键来宣布一个新的redis主机。这应该可以通过在redis sentinel上订阅switch-master频道来实现。 [1]该消息的值应该是<master name> <oldip> <oldport> <newip> <newport>的行,我想将newip设置为etcd上的值。

收到该消息时我想要运行的命令是etcdctl set /redis/master $NEWIP

[1] http://redis.io/topics/sentinel

bash redis systemd etcd
2个回答
2
投票

因为redis-cli订阅输出目前是缓冲的(https://github.com/antirez/redis/issues/2074),目前这是不可能的。


1
投票

你可以使用一个棘手的方法:expect,将其保存在可执行文件redis-listen.expect

#!/usr/bin/expect
spawn redis-cli psubscribe YOUR_CHANNEL_PATTERN*
expect

现在你可以听redis了:

./redis-listen.expect | grep channel
© www.soinside.com 2019 - 2024. All rights reserved.