Прочтите стандартный вывод подписки redis-cli и запустите команду bash для сообщения

Я хотел бы сценарий Bash, который читает стандартный вывод redis-cli подписаться и что-то делает, когда сообщение получено, вместе со значением сообщения.

Подписка может быть передана как аргумент redis-cli вот так

redis-cli --raw subscribe foo

но затем мне нужно передать этот стандартный вывод, чтобы я мог проанализировать сообщения. Я думал об использовании while read line; do цикл, но одно сообщение redis занимает 3 строки.

Обновить

Моя цель - объявить нового мастера Redis, установив ключ на etcd. Это должно быть достижимо, подписавшись на switch-master канал на редис часового. [1] Значение этого сообщения должно быть примерно таким <master name> <oldip> <oldport> <newip> <newport> и я хотел бы установить это newip в качестве значения на etcd.

Команда, которую я хотел бы выполнить, когда это сообщение получено, etcdctl set /redis/master $NEWIP

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

3 ответа

Вы можете использовать хитрый способ: expect, сохраните это в исполняемом файле redis-listen.expect

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

и теперь вы можете слушать Redis:

./redis-listen.expect | grep channel

Поскольку вывод подписки redis-cli в настоящее время буферизован ( https://github.com/antirez/redis/issues/2074), в настоящее время это невозможно.

Вам нужно отключить буферизацию вывода и читать целые строки:

      stdbuf -oL redis-cli --raw SUBSCRIBE channel | while read RCMD; do
    read CHANNEL
    read MSG
    [[ $RCMD == message ]] && echo "$QUEUE: $MSG"
done
Другие вопросы по тегам