Empecemos por ver las conexiones de red activas en el sistema, lsof nos devuelve entre otros datos, el comando que origina el proceso, el número de proceso en el sistema, el usuario que lo ha ejecutado, etc:
lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd-r 407 systemd-resolve 12u IPv4 15056 0t0 UDP localhost:domain systemd-r 407 systemd-resolve 13u IPv4 15057 0t0 TCP localhost:domain (LISTEN) sshd 462 root 3u IPv4 16238 0t0 TCP *:ssh (LISTEN) sshd 462 root 4u IPv6 16240 0t0 TCP *:ssh (LISTEN) sshd 28072 miguel 4u IPv4 546562 0t0 TCP vmi426186.server.net:ssh->170.253.51.33:34214 (ESTABLISHED) [...]
Si lo que queremos ver es el proceso que está escuchando un determinado puerto, esto me ha ocurrido en algunas ocasiones al acceder a un servidor que no está instalado por mi o al intentar ejecutar algún servicio y obtener un error sobre que el puerto ya está en uso. Para listar los procesos utilizando el puerto 22 ejecutamos:
lsof -iTCP:22
Obtenemos que el servido sshd está escuchando y que hay una conexión establecida desde el equipo 133.253.51.33:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 462 root 3u IPv4 16238 0t0 TCP *:ssh (LISTEN) sshd 462 root 4u IPv6 16240 0t0 TCP *:ssh (LISTEN) sshd 26256 root 4u IPv4 506961 0t0 TCP vmi426133.server.net:ssh->133.253.51.33:60162 (ESTABLISHED)
Si sólo queremos saber los procesos escuchando en ese puerto agrega -sTCP:LISTEN
lsof -iTCP:22 -sTCP:LISTEN
Lsof nos puede servir de ayuda cuando queremos saber que procesos están utilizando un determinado fichero o directorio, por ejemplo al intentar borrar un directorio y el sistema lanzar un error sobre que el mismo está en uso, podemos obtener información ejecutando:
lsof +D /dev/input/
Esta instrucción nos daría un listado con los procesos utilizando /dev/input:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd-l 442 root 16u CHR 13,64 0t0 148 /dev/input/event0 systemd-l 442 root 17u CHR 13,65 0t0 150 /dev/input/event1
Si el objetivo es conocer los procesos utilizando un fichero tenemos:
lsof -c /path/to/file
Si tienes curiosidad por que ficheros utiliza un determinado servicio, también es posible averiguarlo con lsof:
lsof -c proceso-o-comando
Tambiés lsof admite un parámetro -r, para poder actualizar la información de forma recurrente, si tienes libreoffice instalador y ejecutas writer, verás un buen monton de ficheros involucrados en la ejecución del programa, si guardas un documento verás que la información se actualiza informando de la ruta donde has almacenado el fichero:
lsof -r 1 -c soffice.bin
Enlazando esta información con otros comandos podría ver los ficheros que el programa utiliza durante tu flujo de trabajo.
El comando admite parámetros para consultar la actividad de usuarios, para ellos utilizaremos el parámetro -u, a su vez tenemos un parámetro de exclusión para consultar la actividad de usuarios excluyendo los indicados:
root@vmi426186:~# lsof -u miguel COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 28040 miguel cwd DIR 8,2 4096 2 / systemd 28040 miguel rtd DIR 8,2 4096 2 / systemd 28040 miguel txt REG 8,2 1599584 12066199 /usr/lib/systemd/systemd systemd 28040 miguel mem REG 8,2 1369352 12059653 /usr/lib/x86_64-linux-gnu/libm-2.31.so [...]
Consultar actividad de todos los usuarios excepto root:
lsof -i -u^root COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd-r 407 systemd-resolve 12u IPv4 15056 0t0 UDP localhost:domain systemd-r 407 systemd-resolve 13u IPv4 15057 0t0 TCP localhost:domain (LISTEN) sshd 28072 miguel 4u IPv4 546562 0t0 TCP vmi426333.server.net:ssh->170.253.51.33:34214 (ESTABLISHED)
Una opción interesante puede ser eliminar todos los procesos activos de un determinado usuario:
# kill -9 `lsof -t -u nombre_usuario`
Como podeis ver lsof es un recurso que viene bien conocer y que nos puede facilitar información valiosa acerca de lo que ocurre en el sistema, de igual manera nos puede ayudar a detectar procesos pueden interferir en nuestro trabajo y así ahorrar nuestro valioso tiempo.
Saludos y hasta la próxima.