我正在运行 Debian Squeeze Web 服务器。我在其上安装了 memcached,并将 memcached 配置为侦听 Unix 域套接字(位于/tmp/memcached.sock
),因为它只需要从位于同一服务器上的网站接收消息。
它似乎工作正常,但我还想通过 shell 与 memcached 进行通信,以检查它是否正在执行我认为它正在执行的操作。
memcached 通过简单的 ASCII 协议接受消息(如果我理解正确的话)。如果它正在侦听 TCP/IP,我可以通过以下方式向它发送消息nc
:
$ echo "stats settings" | nc localhost 11211
但我不知道如何将该文本发送到域套接字。
在我的笔记本电脑(运行 OS X Lion)上,nc
和都有使用域套接字的telnet
选项(分别为-U
和)。-u
然而,在我的 Debian Squeeze Web 服务器上,这些选项不存在。
答案1
和socat
(“两个数据通道之间的双向数据中继”)您可以像这样连接到 unix 域套接字:
$ socat - UNIX-CONNECT:/tmp/memcached.sock
答案2
有了netcat-openbsd
,就有一个-U
选项。如果您没有,您可能已经netcat-traditional
安装了;我建议切换。
命令示例:
nc -U /var/run/socket
答案3
netcat-openbsd
支持连接到 UNIX 域套接字。使用它您可以连接到UNIX域流套接字或一个UNIX 域数据报套接字,因此您必须将套接字的类型告知 netcat。
例如,/dev/log
Linux 中的文件是UNIX 域数据报套接字套接字,因此nc -U /dev/log
行不通。而是使用nc -uU /dev/log
.将 -u 与 -U 一起使用告诉 netcat 它是一个 UNIX 域数据报套接字。
nc -U /tmp/socket #Connect to UNIX-domain stream socket
nc -uU /tmp/socket #Connect to UNIX-domain datagram socket
同样,在使用 时socat
,请使用 UNIX-CLIENT 选项。使用此选项您可以连接到两者UNIX域流和UNIX域数据报插座。从它的手册页(曼·索卡特),”它首先尝试连接,如果失败,则假定它是数据报套接字,因此支持这两种类型”。
socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type
答案4
如果您碰巧在只安装了 busybox 的系统上,它可能看起来不支持 unix 域套接字(该-U
选项不存在),但我发现以下工作:
$ echo "stats slabs" | nc local:/tmp/memcached.sock
STAT active_slabs 0
STAT total_malloced 0
END
这对于为 alpine 容器创建健康检查非常有帮助。