El comando lsof
(List Open Files) es una herramienta poderosa en sistemas Unix y Linux para mostrar información sobre los archivos que están abiertos por los procesos en el sistema. Esta guía completa te proporcionará una descripción detallada de sus opciones, cómo utilizar el comando y ejemplos prácticos de uso.
¿Qué es lsof
?
lsof
muestra una lista de archivos abiertos y los procesos que los tienen abiertos. En Unix y Linux, "todo es un archivo", por lo que un archivo puede ser un archivo regular, un directorio, un socket de red, una tubería, un dispositivo, etc. Con lsof
, puedes inspeccionar estos archivos y los procesos asociados a ellos.
Instalación
En la mayoría de las distribuciones de Linux, lsof
está disponible por defecto. Si no lo tienes instalado, puedes hacerlo utilizando el gestor de paquetes de tu distribución:
- Ubuntu/Debian:
sudo apt-get install lsof
- CentOS/Fedora:
sudo yum install lsof
Sintaxis básica
La sintaxis básica de lsof
es:
lsof [opciones] [archivo(s) o directorio(s)]
Opciones más comunes de lsof
-a
: Combina varias opciones usando AND en lugar de OR. Útil para filtrar resultados.- Ejemplo: Mostrar solo los archivos abiertos por el proceso 1234 que están en el directorio
/home/user
:lsof -a -p 1234 +D /home/user
- Ejemplo: Mostrar solo los archivos abiertos por el proceso 1234 que están en el directorio
-c <nombre>
: Muestra archivos abiertos por procesos que coinciden con el nombre dado.- Ejemplo: Mostrar archivos abiertos por procesos cuyo nombre empieza con "sshd":
lsof -c sshd
- Ejemplo: Mostrar archivos abiertos por procesos cuyo nombre empieza con "sshd":
-p <PID>
: Muestra archivos abiertos por el proceso con el ID especificado.- Ejemplo: Mostrar archivos abiertos por el proceso con PID 1234:
lsof -p 1234
- Ejemplo: Mostrar archivos abiertos por el proceso con PID 1234:
-u <usuario>
: Muestra archivos abiertos por los procesos pertenecientes a un usuario específico.- Ejemplo: Mostrar archivos abiertos por procesos del usuario
root
:lsof -u root
- Ejemplo: Mostrar archivos abiertos por procesos del usuario
-i <condición>
: Muestra archivos relacionados con conexiones de red que coinciden con la condición dada (por ejemplo, puerto, protocolo, dirección).- Ejemplo: Mostrar conexiones de red abiertas en el puerto 22:
lsof -i :22
- Ejemplo: Mostrar conexiones de red abiertas por procesos que utilizan el protocolo TCP:
lsof -i TCP
- Ejemplo: Mostrar conexiones de red abiertas en el puerto 22:
+D <directorio>
: Muestra todos los archivos abiertos bajo un directorio específico, de manera recursiva.- Ejemplo: Mostrar todos los archivos abiertos en
/var/log
:lsof +D /var/log
- Ejemplo: Mostrar todos los archivos abiertos en
+d <directorio>
: Similar a+D
, pero solo muestra los archivos en el directorio dado (no recursivo).- Ejemplo: Mostrar archivos abiertos en el directorio
/tmp
:lsof +d /tmp
- Ejemplo: Mostrar archivos abiertos en el directorio
-t
: Muestra solo los PIDs de los procesos que tienen los archivos abiertos.- Ejemplo: Mostrar PIDs de procesos que tienen archivos abiertos en
/var/log
:lsof -t +D /var/log
- Ejemplo: Mostrar PIDs de procesos que tienen archivos abiertos en
-n
y-P
:-n
impide la resolución de nombres de hosts, y-P
impide la conversión de números de puerto a nombres de servicio. Esto acelera el comando.- Ejemplo: Mostrar conexiones de red sin convertir nombres de host ni nombres de servicio:
lsof -i -n -P
- Ejemplo: Mostrar conexiones de red sin convertir nombres de host ni nombres de servicio:
-r <intervalo>
: Repite el comandolsof
cada intervalo de tiempo (en segundos).- Ejemplo: Ejecutar
lsof
cada 5 segundos:lsof -r 5
- Ejemplo: Ejecutar
-U
: Muestra solo los sockets de dominio UNIX.- Ejemplo: Mostrar sockets de dominio UNIX:
lsof -U
- Ejemplo: Mostrar sockets de dominio UNIX:
-s <tamaño>
: Filtra archivos abiertos por tamaño, mostrando solo aquellos que cumplen con el criterio.- Ejemplo: Mostrar archivos abiertos que son mayores a 1 MB:
lsof -s 1048576
- Ejemplo: Mostrar archivos abiertos que son mayores a 1 MB:
Ejemplos de uso práctico de lsof
- Listar archivos abiertos por un usuario específico:
lsof -u username
Este comando mostrará todos los archivos que están siendo usados por los procesos que pertenecen al usuariousername
. - Listar todos los archivos abiertos por el sistema:
lsof
Esto muestra una lista de todos los archivos abiertos en el sistema. - Listar todos los archivos abiertos en un directorio específico:
lsof +D /path/to/directory
Este comando listará todos los archivos abiertos dentro de un directorio y sus subdirectorios. - Listar procesos que tienen un archivo específico abierto:
lsof /path/to/file
Esto muestra los procesos que tienen el archivo/path/to/file
abierto. - Listar conexiones de red abiertas:
lsof -i
Este comando muestra todas las conexiones de red activas. - Listar conexiones de red abiertas por un puerto específico:
lsof -i :80
Muestra las conexiones de red abiertas en el puerto 80 (comúnmente usado por HTTP). - Forzar la terminación de procesos que tienen un archivo específico abierto:
kill -9 $(lsof -t /path/to/file)
Esto matará todos los procesos que tienen el archivo/path/to/file
abierto. - Monitorear archivos abiertos en tiempo real:
lsof -r 2
Esto ejecutará el comandolsof
cada 2 segundos, mostrando la lista actualizada de archivos abiertos.
Conclusión
El comando lsof
es una herramienta versátil y esencial para la administración de sistemas Unix y Linux, permitiendo a los administradores de sistemas diagnosticar problemas, monitorizar la actividad de archivos y gestionar los recursos del sistema de manera efectiva. Con las opciones y ejemplos proporcionados en esta guía, deberías tener una comprensión sólida de cómo utilizar lsof
en diversas situaciones.