使用plink监控memcached

我需要一个telnet客户端,可以从一个文件或标准input命令,所以我可以做一些快速和脏的自动监控memcached。 我认为plink会对此有所帮助,但它似乎正在做一些超出我需要的事情:

如果我telnet到本地主机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>执行任何给定的命令,因此您可以直接input您的telnet请求。

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

这将被解释为sh -c '(echo "stats"; sleep 1; echo "quit") | telnet localhost 11211' sh -c '(echo "stats"; sleep 1; echo "quit") | telnet localhost 11211'每30秒

编辑

似乎watch有转义$'\nstats' 。 也许与plink最简单的解决scheme是将整个命令包含在引号中。 以下组合适用于我:

 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有什么不同呢?

给memcached的第一个命令总是会导致错误。

 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连接一致。 您可以通过切换到plink的-raw协议来删除ERROR ,但是您需要添加完整的换行符和相当的命令

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

更多的工作,但更漂亮的输出。