Cómo obtener los sockets Unix abiertos en Linux
Los sockets Unix son una de las formas de comunicación entre procesos que más se usan en Linux. Por este motivo, muchas veces es muy útil a la hora de realizar diagnósticos obtener los sockets Unix abiertos o a la escucha.
Este será el objetivo de este tutorial, en el que se explica cómo obtener un listado con todos los sockets Unix abiertos y para ello sólo necesitaremos acceso a la terminal Linux.
Cómo obtener los sockets Unix abiertos en Linux desde la consola.
Sé que muchos ya conocéis en profundidad los sockets Unix y que sólo os interesa como listarlos. Por ello os muestro en primer lugar el comando que usaremos y después haremos una breve explicación de diferentes conceptos para los que son nuevos en el mundo de los sockets Unix.
Comando para listar los sockets Unix abiertos en el sistema:
netstat -xl
zeokat@ubuntu:~$ sudo netstat -xl Active UNIX domain sockets (only servers) Proto RefCnt Flags Type State I-Node Path unix 2 [ ACC ] STREAM LISTENING 16209 public/flush unix 2 [ ACC ] STREAM LISTENING 10818 /run/systemd/private unix 2 [ ACC ] STREAM LISTENING 10822 /run/systemd/fsck.progress unix 2 [ ACC ] STREAM LISTENING 16436 /run/user/1000/systemd/private unix 2 [ ACC ] SEQPACKET LISTENING 10833 /run/udev/control unix 2 [ ACC ] STREAM LISTENING 16218 private/smtp unix 2 [ ACC ] STREAM LISTENING 10836 /run/systemd/journal/stdout unix 2 [ ACC ] STREAM LISTENING 16221 private/relay unix 2 [ ACC ] STREAM LISTENING 16224 public/showq unix 2 [ ACC ] STREAM LISTENING 16184 public/cleanup unix 2 [ ACC ] STREAM LISTENING 16180 public/pickup unix 2 [ ACC ] STREAM LISTENING 16187 public/qmgr unix 2 [ ACC ] STREAM LISTENING 15597 /var/run/mysqld/mysqld.sock unix 2 [ ACC ] STREAM LISTENING 16251 private/maildrop unix 2 [ ACC ] STREAM LISTENING 16254 private/uucp unix 2 [ ACC ] STREAM LISTENING 16257 private/ifmail unix 2 [ ACC ] STREAM LISTENING 16260 private/bsmtp unix 2 [ ACC ] STREAM LISTENING 16263 private/scalemail-backend unix 2 [ ACC ] STREAM LISTENING 13362 /run/uuidd/request unix 2 [ ACC ] STREAM LISTENING 13363 /var/run/dbus/system_bus_socket unix 2 [ ACC ] STREAM LISTENING 16266 private/mailman
La explicación del comando es muy sencilla, usamos la herramienta netstat con las siguientes opciones:
x
: filtra el listado para mostrar únicamente los sockets Unix.l
: muestra únicamente los sockets que están a la escucha, también llamados servidores.
A veces es interesante conocer PID del proceso o programa que es dueño del socket, para esto sólo tenemos que agregar la opción -p
, de forma que el comando sería:
sudo netstat -xlp
zeokat@ubuntu:~$ sudo netstat -xlp Active UNIX domain sockets (only servers) Proto RefCnt Flags Type State I-Node PID/Program name Path unix 2 [ ACC ] STREAM LISTENING 16209 1224/master public/flush unix 2 [ ACC ] STREAM LISTENING 10818 1/init /run/systemd/private unix 2 [ ACC ] STREAM LISTENING 10822 1/init /run/systemd/fsck.progress unix 2 [ ACC ] STREAM LISTENING 16436 1233/systemd /run/user/1000/systemd/private unix 2 [ ACC ] SEQPACKET LISTENING 10833 1/init /run/udev/control unix 2 [ ACC ] STREAM LISTENING 16218 1224/master private/smtp unix 2 [ ACC ] STREAM LISTENING 10836 1/init /run/systemd/journal/stdout unix 2 [ ACC ] STREAM LISTENING 16221 1224/master private/relay unix 2 [ ACC ] STREAM LISTENING 16224 1224/master public/showq unix 2 [ ACC ] STREAM LISTENING 16184 1224/master public/cleanup unix 2 [ ACC ] STREAM LISTENING 16180 1224/master public/pickup unix 2 [ ACC ] STREAM LISTENING 16187 1224/master public/qmgr unix 2 [ ACC ] STREAM LISTENING 15597 1031/mysqld /var/run/mysqld/mysqld.sock unix 2 [ ACC ] STREAM LISTENING 16251 1224/master private/maildrop unix 2 [ ACC ] STREAM LISTENING 16254 1224/master private/uucp unix 2 [ ACC ] STREAM LISTENING 16257 1224/master private/ifmail unix 2 [ ACC ] STREAM LISTENING 16260 1224/master private/bsmtp unix 2 [ ACC ] STREAM LISTENING 16263 1224/master private/scalemail-backend unix 2 [ ACC ] STREAM LISTENING 13362 1/init /run/uuidd/request unix 2 [ ACC ] STREAM LISTENING 13363 1/init /var/run/dbus/system_bus_socket unix 2 [ ACC ] STREAM LISTENING 16266 1224/master private/mailman
En este caso he usado sudo para ejecutar el comando, sino seguramente no tengamos permisos suficientes para ver todos los PID.
Introducción a los sockets Unix.
Para adentrarnos un poco más en el mundo de los sockets Unix, vamos a intentar hacer una explicación sencilla y asequible. Para esto, debemos empezar explicando qué es un socket y podríamos definirlo como un método abstracto que permite el flujo de datos. Generalmente se asocia el concepto de socket con el de un enchufe que pone en contacto dos programas.
Ahora ya podemos definir como socket Unix un método que permite la comunicación entre dos procesos de un mismo equipo. Dicho de otra forma, permite el flujo de datos entre los dos procesos de una forma ordenada y fiable dentro del sistema operativo.
La comunicación puede ser bidireccional cuando se emplean los llamados stream sockets y unidireccional cuando se emplean los datagram sockets.
Una peculiaridad muy importante de los socket UNIX, es que emplean el sistema de archivos como dirección de espacio de nombres, por lo que un UNIX socket se identifica por su nombre de ruta. Esto nos permite hacer uso del sistema de control de permisos de archivos y emplearlos conjuntamente con el socket para establecer permisos.
Por último, propongo como ejemplo de UNIX socket cuando configuramos un servidor Nginx o Apache con PHP-FPM, donde generalmente recurrirnos a un socket para que el servidor y el módulo de procesamiento PHP se comuniquen.