2

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

订阅可以作为参数传递给redis-cli喜欢

redis-cli --raw subscribe foo

但是然后我需要将该标准输出通过管道传输到某些东西,以便我可以解析消息。我考虑过使用while read line; do循环,但单个 redis 消息占用 3 行。

更新

我的结局是通过在 etcd 上设置一个键来宣布一个新的 redis 主控。这应该可以通过订阅switch-masterredis 哨兵上的频道来实现。[1] 该消息的值应该类似于以下内容<master name> <oldip> <oldport> <newip> <newport>,我想将其设置newip为 etcd 上的值。

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

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

4

3 回答 3

2

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

于 2014-10-22T02:04:49.170 回答
1

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

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

现在你可以听redis了:

./redis-listen.expect | grep channel
于 2018-09-01T15:11:43.750 回答
0

您必须禁用输出缓冲并读取整行:

stdbuf -oL redis-cli --raw SUBSCRIBE channel | while read RCMD; do
    read CHANNEL
    read MSG
    [[ $RCMD == message ]] && echo "$QUEUE: $MSG"
done
于 2021-02-08T13:59:35.583 回答