读取redis-cli subscribe的标准输出并对消息运行bash命令

6l7fqoea  于 2022-10-31  发布在  Redis
关注(0)|答案(3)|浏览(156)

我想要一个bash脚本,它读取redis-cli订阅的stdout,并在接收到消息时执行一些操作,沿着消息值。
subscribe可以作为参数传入redis-cli,如下所示

redis-cli --raw subscribe foo

但是我需要将stdout连接到某个东西,这样我就可以解析消息了。我想过使用while read line; do循环,但是一个redis消息要占用3行。

更新

我的最终目的是通过在etcd上设置一个键来宣布一个新的redis主人。这应该可以通过订阅redis哨兵上的switch-master通道来实现。[1]该消息的值应该是<master name> <oldip> <oldport> <newip> <newport>,我想在etcd上设置newip作为一个值。
收到该消息时,我希望运行的命令是etcdctl set /redis/master $NEWIP
[1][http://redis.io/topics/sentinel](http://redis.io/topics/sentinel)

7ivaypg9

7ivaypg91#

由于redis-cli订阅者输出当前正在缓冲(https://github.com/antirez/redis/issues/2074),因此这在当前是不可能。

p1tboqfb

p1tboqfb2#

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


# !/usr/bin/expect

spawn redis-cli psubscribe YOUR_CHANNEL_PATTERN*
expect

现在你可以听Redis:

./redis-listen.expect | grep channel
t5zmwmid

t5zmwmid3#

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

stdbuf -oL redis-cli --raw SUBSCRIBE channel | while read RCMD; do
    read CHANNEL
    read MSG
    [[ $RCMD == message ]] && echo "$CHANNEL: $MSG"
done

相关问题