Monitoring
使用 plink 監控 memcached
我需要一個可以從文件或標準輸入中獲取命令的 telnet 客戶端,這樣我就可以對 memcached 進行一些快速而簡單的自動監控。我認為 plink 會對此有好處,但它似乎做的事情超出了我的需要:
如果我 telnet 到 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,但我需要一種方法來不斷地向 memcached 發送簡單的 telnet 命令,而無需編寫成熟的 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 不同?
給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協議的結果。想不出為什麼,但似乎與putty的telnet連接一致。您可以ERROR
通過切換到 plink 的-raw
協議來刪除,但您需要添加完整的換行符和相當命令watch -n 30 "plink -v -raw -P 11211 127.0.0.1 <<< $'stats\r\nquit\r\n'"
更多的工作,但更漂亮的輸出。