在过去的几天中,Jason和我一直在将我们的一些应用程序移植到一个新的puppet(一种集中配置管理系统)中,我们需要做的一件事是检查消息是否正确通过了beanstalkd(一个高性能、轻量级的分布式内存队列系统)。
我们最初的想法是 它没有被正确地配置,所以Paul给我们展示了一种通过连接到它所运行的端口来检查是否是这种情况的方法:
$ telnet localhost 11300
stats
current-jobs-urgent: 0
current-jobs-ready: 0
current-jobs-reserved: 0
current-jobs-delayed: 0
current-jobs-buried: 0
cmd-put: 66
...
current-connections: 6
current-producers: 1
current-workers: 1
current-waiting: 1
total-connections: 58
pid: 15622
version: 1.4.6
rusage-utime: 0.000000
rusage-stime: 0.040002
uptime: 22740
binlog-oldest-index: 0
binlog-current-index: 0
binlog-max-size: 10485760
我们用这种方式设置了我们的beanstalks消费者,如果它不能正确地处理消息,我们将把消息放回到'buried'(掩埋)状态的队列中,所以我们会在‘current-jobs-buried’属性里看到一个大于0的数字。
我很好奇,我们该怎样写一行代码来使用netcat(一个用于网络连接工具)获取这些统计信息,并且在一些小操作之后,强制让这个新的字符串正确地发送出去,结果如下:
$ echo -e“stats \ r \ n”| nc localhost 11300
关键是我以前可能已经写过了'-e'参数,但却忘记了:
-e
enable interpretation of the backslash-escaped characters listed below
...
\NNN
the character whose ASCII code is NNN (octal)
\\
backslash
\a
alert (BEL)
\b
backspace
\c
suppress trailing newline
\f
form feed
\n
new line
\r
carriage return
\t
horizontal tab
\v
vertical tab
我们可以看看如何使用下面的例子:
$ echo -e "mark\nmark"
mark
mark
$ echo "mark\nmark"
mark\nmark
或者,我们可以通过“-c”或“-C”参数来连接,这取决于我们的netcat版本,CRLF /newline 将作为结束行被发送:
# netcat-openbsd version
$ echo "stats" | nc -C localhost 11300
要么像下面这样
# one on Mac OS X by default
$ echo "stats" | nc -c localhost 11300
回到beanstalkd - 实际上有一个很好的文档解释了你可以发送给它的所有不同的命令,其中大部分我还没有试过!
我遇到了一些有用的:
$ telnet localhost 11300
list-tubes
OK 14
---
- default
use default
USING DEFAULT
peek-ready
NOT_FOUND
stats-tube default
OK 253
---
name: default
current-jobs-urgent: 0
current-jobs-ready: 0
current-jobs-reserved: 0
current-jobs-delayed: 0
current-jobs-buried: 0
total-jobs: 155
current-using: 9
current-watching: 9
current-waiting: 1
cmd-pause-tube: 0
pause: 0
pause-time-left: 0
我偶然发现了beanstalk-tools,其中包含了一些用于处理beanstalks的工具,但由于我们只是偶尔用它发送TCP(Transmission Control Protocol 传输控制协议)请求,所以它可能可以做到!