我需要一个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'"
更多的工作,但更漂亮的输出。