Упоротые Bash/Shell однострочники

Опубликовано 24 авг. 2025 г.
Автор: ismvru

Как послать PING всем серверам кластера редиса и не умереть от скуки

for nodeport in $(echo "CLUSTER NODES" | nc redis.example 6900 | awk '$1~/^[0-9a-z].*$/ {sub("@"," "); print $2}'); do IFS=":" read -r node port <<< $nodeport; echo -n "$nodeport: "; echo "PING" | nc $node $port; done

Первым делом мы шлём в известный нам сервер кластера redis команду CLUSTER NODES.

ЧИТАТЬ ПЕРВЫМ В ТЕЛЕГРАМ
echo "CLUSTER NODES" | nc redis.example 6900

Референс команды cluster nodes.

Пример выхлопа

$5256
07c37dfeb235213a872192d90877d0cd55635b91 127.0.0.1:30004@31004,hostname4 slave e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 0 1426238317239 4 connected
67ed2db8d677e59ec4a4cefb06858cf2a1a89fa1 127.0.0.1:30002@31002,hostname2 master - 0 1426238316232 2 connected 5461-10922
292f8b365bb7edb5e285caf0b7e6ddc7265d2f4f 127.0.0.1:30003@31003,hostname3 master - 0 1426238318243 3 connected 10923-16383
6ec23923021cf3ffec47632106199cb7f496ce01 127.0.0.1:30005@31005,hostname5 slave 67ed2db8d677e59ec4a4cefb06858cf2a1a89fa1 0 1426238316232 5 connected
824fe116063bc5fcf9f4ffd895bc17aee7731ac3 127.0.0.1:30006@31006,hostname6 slave 292f8b365bb7edb5e285caf0b7e6ddc7265d2f4f 0 1426238317741 6 connected
e7d1eecce10fd6bb5eb35b9f99a514335d9ba9ca 127.0.0.1:30001@31001,hostname1 myself,master - 0 0 1 connected 0-5460

Дальше мы парсим выхлоп awk-шкой, так как нам нужны чисто IP и порт

awk '$1~/^[0-9a-z].*$/ {sub("@"," "); print $2}')

$1~/^[0-9a-z].*$/ - берём строчки, которые начинаются с циферкобуковок

{sub("@"," "); print $2} - режем дополнительно по символу собаки, выводим 2ю колонку. Получаем:

127.0.0.1:30004
127.0.0.1:30002
127.0.0.1:30003
127.0.0.1:30005
127.0.0.1:30006
127.0.0.1:30001

Ура, у нас есть список редисок с портами. Всё это заворачиваем в for:

for nodeport in $(echo "CLUSTER NODES" | nc redis.example 6900 | awk '$1~/^[0-9a-z].*$/ {sub("@"," "); print $2}'); do ...; done

И кайф, осталось порезать по двоеточию в разные переменные хост и порт, и, вооружившись netcat-ом, сделать PING.

Режем строку по двоеточию на 2 переменных

IFS=":" read -r node port <<< $nodeport;

Итого у нас получается следующее:

nodeport=127.0.0.1:30004
node=127.0.0.1
port=30004

Выводим себе для удобства чтения результата хост редиса и порт куда стучимся:

echo -n "$nodeport: "

И netcat-ом шлём команду PING уже на ноду.

echo "PING" | nc $node $port

Получаем на выходе:

127.0.0.1:30004: +PONG
127.0.0.1:30002: +PONG
127.0.0.1:30003: +PONG
127.0.0.1:30005: +PONG
127.0.0.1:30006: +PONG
127.0.0.1:30001: +PONG

Комментарии