Anteriormente expliqué cómo determinar qué proceso tiene un puerto abierto utilizando netstat. En esta oportunidad voy a demostrar el uso de la herramienta fuser para identificar el proceso que está utilizando cierto archivo o socket.



Veamos por ejemplo el siguiente archivo:

root@hal9000:/home/emi# ll /var/run/cups/cups.sock 
srwxrwxrwx 1 root root 0 Oct 29 08:02 /var/run/cups/cups.sock

Típicamente en los sistemas operativos de la familia Unix se suele utilizar la extensión .sock para identificar a un archivo que corresponde con un socket.

root@hal9000:/home/emi# file /var/run/cups/cups.sock 
/var/run/cups/cups.sock: socket

Es posible comprobar que efectivamente se trata de un socket Unix utilizando la herramienta file. Tal como se observa en la salida anterior.

Al igual que para el caso de los puertos TCP y UDP, es posible identificar el proceso que mantiene el socket Unix abierto utilizando netstat junto con la opción -xl:

root@hal9000:/home/emi# netstat -xlpn | grep cups
unix  2      [ ACC ]     STREAM     LISTENING     112569   4092/cupsd           /var/run/cups/cups.sock

La opción -x permite listar sólo sockets Unix. Luego las opciones -lpn se utilizan para mostrar aquellos en estado listening (escuchando peticiones), mostrar los puertos en formato numérico y visualizar el PID/proceso asociado respectivamente.

La herramienta fuser (provista en Debian por el paquete psmisc) permite lograr el mismo cometido, sólo basta con pasar la ruta al archivo o socket como parámetro:

root@hal9000:/home/emi# fuser /var/run/cups/cups.sock 
/run/cups/cups.sock:  4092

fuser retorna el nombre de archivo junto con el PID de proceso que lo está utilizando. Luego se puede recurrir a ps para obtener más información sobre el mismo:

root@hal9000:/home/emi# ps 4092
  PID TTY      STAT   TIME COMMAND
 4092 ?        Ss     0:00 /usr/sbin/cupsd -C /etc/cups/cupsd.conf -s /etc/cups/cups-files.conf

Sin embargo, fuser no lista sólo el PID del proceso que tiene el socket abierto sino que lista los PID de todos los procesos que lo están utilizando. Veamos qué información muestra para el directorio $HOME del usuario actual:

emi@hal9000:~$ fuser ~
/home/emi:            2072c  2161c  2181c  2182c  2184c  2185c  2187c  2196c  2383c  2384c  2385c  2428c  2435c  2440c  2467c  2579c  2612c  2636c  2638c  2827c  2835c

Tal como se observa en la salida, fuser muestra un listado con todos los procesos que están utilizando el archivo. El término "utilizar" puede tener varios significados, los cuales se identifican con una letra al final de cada PID (notar la letra c a la derecha de cada PID en la salida anterior):

    c    directorio de trabajo actual.
    e    binario en ejecución.
    f    archivo abierto.
    F    archivo abierto para escritura
    r    directorio raíz.
    m    archivo mapeado en memoria o librería compartida.

Tener en cuenta que las letras f y F no se muestran en la salida por defecto.

Más ejemplos

Un archivo que corresponde con un binario ejecutable y la lista de procesos que lo están ejecutando:

emi@hal9000:~$ fuser /usr/lib/firefox-esr/firefox-esr
/usr/lib/firefox-esr/firefox-esr:  2467e  2579e  2612e  2636e  2638e

Todos los procesos que están utilizando una librería compartida:

root@hal9000:/home/emi# fuser /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libc-2.24.so:     1m   436m  1467m  1481m  1485m  1538m  1539m  1581m  1660m  1697m  1716m  1736m  1737m  1758m  1804m  1867m  1900m  1901m  1913m  1937m  1951m  1964m  1965m  1966m  1967m  1968m  1969m  1994m  2061m  2072m  2115m  2116m  2151m  2161m  2163m  2168m  2170m  2174m  2180m  2181m  2182m  2184m  2185m  2187m  2192m  2196m  2200m  2278m  2383m  2384m  2385m  2392m  2397m  2409m  2411m  2428m  2435m  2440m  2467m  2579m  2612m  2636m  2638m  2827m  2835m  3361m  3365m  3379m  3500m  3502m  3541m

Opciones avanzadas

fuser permite mostrar su salida al estilo ps mediante la opción -v:

root@hal9000:/home/emi# fuser -v /var/run/cups/cups.sock 
                     USER        PID ACCESS COMMAND
/run/cups/cups.sock: root       1736 F.... cupsd

Este formato permite identificar si el archivo o socket está abierto en modo de escritura (F) o lectura (f).

Con -u, además del PID del proceso utilizando el archivo se muestra el nombre de usuario con el que corre dicho proceso:

root@hal9000:/home/emi# fuser -u /var/run/cups/cups.sock 
/run/cups/cups.sock:  1736(root)

Con -k es posible matar todos los procesos que están utilizando un archivo pasado como parámetro.

Con -m es posible listar todos los procesos utilizando un sistema de archivos montado (procesos que tiene abierto al menos un archivo dentro de dicho filesystem). Se puede pasar tanto el punto de montaje como la ruta a un dispositivo.

Para más información, consultar la página de manual man fuser.


Tal vez pueda interesarte


Compartí este artículo