I’m running a Debian Squeeze web server. I’ve installed memcached on it, and configured memcached to listen on a Unix domain socket (at /tmp/memcached.sock), as it only needs to receive messages from the website, which lives on the same server.
It seems to be working fine, but I’d also like to communicate with memcached via the shell, to check that it’s doing what I think it’s doing.
memcached accepts messages via a simple ASCII protocol (if I understand correctly). If it was listening on TCP/IP, I could send messages to it via e.g. nc:
$ echo "stats settings" | nc localhost 11211
But I can’t figure out how to send that text to the domain socket instead.
On my laptop (which runs OS X Lion), both nc and telnet have options (-U and -u respectively) to use domain sockets. However, on my Debian Squeeze web server, these options aren’t present.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
With socat (a ‘bidirectional data relay between two data channels’) you can connect to the unix domain socket like this:
$ socat - UNIX-CONNECT:/tmp/memcached.sock
Method 2
With netcat-openbsd, there is a -U option. If you don’t have it, you probably have netcat-traditional installed instead; I’d suggest switching.
Example command:
nc -U /var/run/socket
Method 3
netcat-openbsd supports connecting to UNIX-domain sockets. Using this you can connect to either a UNIX-domain stream socket or a UNIX-domain datagram socket, and therefore you have to tell the socket’s type to netcat.
for example, /dev/log file in Linux is a UNIX-domain datagram socket socket, thus nc -U /dev/log won’t work. Instead use nc -uU /dev/log. Using -u along with -U tells netcat that it is a UNIX-domain datagram socket.
nc -U /tmp/socket #Connect to UNIX-domain stream socket nc -uU /tmp/socket #Connect to UNIX-domain datagram socket
Similarly, while using socat, use UNIX-CLIENT option. Using this option you can connect to both UNIX-domain stream and UNIX-domain datagram sockets. From its man page (man socat), “It first tries to connect and, if that fails, assumes it is a
datagram socket, thus supporting both types“.
socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type
Method 4
You can use socat on Debian.
To install it:
# apt-get install socat
Method 5
If you happen to be on a system that only has busybox installed, it may look like it doesn’t support unix domain sockets (the -U option doesn’t exist) but I found the following works:
$ echo "stats slabs" | nc local:/tmp/memcached.sock STAT active_slabs 0 STAT total_malloced 0 END
This can be really helpful for creating health checks for alpine containers.
Method 6
Send the request “GET” to the socket “/tmp/server.sock” and print the result:
printf GET | socat UNIX-CONNECT:/tmp/server.sock -
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0