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
.