Cómo obtener los sockets Unix abiertos en Linux

En Tutoriales y Guías por

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.

Cómo obtener los sockets Unix abiertos en Linux

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.