Noticias

Comandos linux: lsof

Entre los comandos poco conocidos y que nos pueden ser útilies en múltiples contextos tenemos lsof. Con lsof (list open files) podemos conocer los ficheros abiertos en el sistema y puesto que en Linux todos los procesos son ficheros tenemos aquí una herramienta muy potente que nos sirve para localizar procesos, ver cuales están siendo abiertos por un usuario o conocer los que escuchan en determinados puertos. Veremos en el post alguno de los usos que espero te sirvan de ayuda.


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.

 


Linux


Compartir mola!!