Monitoring

使用 plink 監控 memcached

  • October 3, 2012

我需要一個可以從文件或標準輸入中獲取命令的 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'"

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

引用自:https://serverfault.com/questions/434093