Назад | Перейти на главную страницу

Мониторинг memcached с помощью plink

Мне нужен telnet-клиент, который может принимать команды из файла или стандартного ввода, чтобы я мог выполнять быстрый и грязный автоматический мониторинг memcached. Я думал, что для этого подойдет plink, но, похоже, он делает что-то сверх того, что мне нужно:

Если я подключусь к localhost 11211 и напишу stats, Я получаю статистику memcached, например:

$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
stats
STAT pid 25099
STAT uptime 91182
STAT time 1349191864
STAT version 1.4.5
STAT pointer_size 64
STAT rusage_user 3.570000
STAT rusage_system 2.740000
STAT curr_connections 5
STAT total_connections 23
STAT connection_structures 11
STAT cmd_get 0
STAT cmd_set 0
STAT cmd_flush 0
STAT get_hits 0
STAT get_misses 0
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 82184
STAT bytes_written 7210
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT bytes 0
STAT curr_items 0
STAT total_items 0
STAT evictions 0
STAT reclaimed 0
END

Но с plink я получаю странную ошибку. Я использую эту команду:

watch -n 30 plink -v -telnet -P 11211 127.0.0.1 <<< $'\nstats'

В первый раз я получаю:

Looking up host "127.0.0.1"
Connecting to 127.0.0.1 port 11211
client: WILL NAWS
client: WILL TSPEED
client: WILL TTYPE
client: WILL NEW_ENVIRON
client: DO ECHO
client: WILL SGA
client: DO SGA
ERROR
STAT pid 25099
STAT uptime 91245
STAT time 1349191927
STAT version 1.4.5
…
END

Но когда часы повторяют команду, я просто получаю:

Looking up host "127.0.0.1"
Connecting to 127.0.0.1 port 11211
client: WILL NAWS
client: WILL TSPEED
client: WILL TTYPE
client: WILL NEW_ENVIRON
client: DO ECHO
client: WILL SGA
client: DO SGA
Failed to connect to 127.0.0.1: Connection reset by peer
Connection reset by peer
FATAL ERROR: Connection reset by peer

Чем здесь plink отличается от обычного telnet? Как мне к этому поступить? (Я не женат на plink, но мне нужен способ непрерывно отправлять простые команды telnet в memcached без написания полноценного сценария perl.)

Зачем использовать plink для запросов telnet? В watch утилита выполнит любую заданную команду с sh -c <command>, чтобы вы могли напрямую ввести свой telnet-запрос.

watch -n 30 '(echo "stats"; sleep 1; echo "quit") | telnet localhost 11211'

Что можно было бы интерпретировать как sh -c '(echo "stats"; sleep 1; echo "quit") | telnet localhost 11211' каждые 30 секунд

РЕДАКТИРОВАТЬ

Кажется watch имеет проблемы с побегом $'\nstats'. Пожалуй, самое простое решение с plink заключается в том, чтобы заключить всю команду в кавычки. У меня работают следующие комбинации:

watch -n 30 "plink -v -telnet -P 11211 127.0.0.1 <<< $'\nstats'"
watch -n 30 '(echo ; echo "stats") | plink -v -telnet -P 11211 127.0.0.1'
watch -n 30 'echo -e "\nstats" | plink -v -telnet -P 11211 127.0.0.1'

Чем здесь plink отличается от обычного telnet?

Первая команда, отданная всегда приводит к ошибке.

bash ~> plink -v -telnet -P 11211 127.0.0.1
plink > Looking up host "127.0.0.1"
plink > Connecting to 127.0.0.1 port 11211
plink > client: WILL NAWS
plink > client: WILL TSPEED
plink > client: WILL TTYPE
plink > client: WILL NEW_ENVIRON
plink > client: DO ECHO
plink > client: WILL SGA
plink > client: DO SGA
memcached < stats
memcached > ERROR

Я полагаю, что это результат plink выдача дополнительного символа во время соединения или что-то, что сбивает Memcached протокол. Не могу понять, почему, но похоже, что это соответствует telnet-соединениям putty. Вы можете удалить ERROR переключившись на Plink's -raw протокол, но вам нужно добавить полные разрывы строк и тихие команды

watch -n 30 "plink -v -raw -P 11211 127.0.0.1 <<< $'stats\r\nquit\r\n'"

Больше работы, но на выходе получше.