Cómo saber qué proceso está usando un archivo o socket

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

