lsof
Muestra qué procesos tienen abiertos los puertos y los archivos.
En Linux casi todo es un archivo, incluidas las conexiones de red. lsof te dice qué programa tiene abierto cada archivo y cada puerto, así que es la respuesta a preguntas como qué proceso ocupa el puerto 80 o quién no me deja desmontar este disco. Si no lo tienes: sudo apt install lsof.
lsof [opciones] [archivo]Despiece
6 ejemplosVer quién ocupa un puerto
| N.º | Pieza | Tipo | Qué hace |
|---|---|---|---|
| 1 | lsof | Comando | El comando que lista los archivos y sockets abiertos. |
| 2 | -i | Opción | Restringe la búsqueda a conexiones de red. |
| 3 | :80 | Valor | El puerto que buscas, con los dos puntos de delante. |
Aparece el nombre del proceso, su PID y el socket. Los dos puntos son obligatorios: lsof -i 80 no encuentra nada. Si solo quieres el PID para pasarlo a otro comando, lsof -t -i :80 lo imprime pelado. Y si el puerto ya no lo tiene nadie escuchando, la salida sale vacía.
Ver todas las conexiones del sistema
| N.º | Pieza | Tipo | Qué hace |
|---|---|---|---|
| 1 | sudo | Comando | Ejecuta la orden como root, que es lo que hace falta para ver los procesos de todos los usuarios. |
| 2 | lsof | Comando | El comando que lista los archivos y sockets abiertos. |
| 3 | -i | Opción | Muestra solo las conexiones de red. |
| 4 | -P | Opción | Puertos con número en lugar de con nombre. |
| 5 | -n | Opción | Direcciones sin resolver a nombres de dominio. |
Cada línea es un socket abierto, del tipo TCP *:80 (LISTEN), TCP 192.168.1.10:443->52.14.9.2:51892 (ESTABLISHED) o similar. Sin sudo solo ves tus propios procesos, así que para un puerto de servicio casi siempre lo vas a necesitar.
Ver todo lo que tiene abierto un proceso
| N.º | Pieza | Tipo | Qué hace |
|---|---|---|---|
| 1 | lsof | Comando | El comando que lista los archivos y sockets abiertos. |
| 2 | -p | Opción | Filtra por número de proceso. |
| 3 | 1234 | Valor | El PID del proceso que quieres inspeccionar. |
Sale cada archivo abierto con su tipo (txt para el ejecutable, cwd para la carpeta actual, REG para archivos normales) y su descriptor. Sirve para descubrir con qué archivo está trabajando un proceso o qué archivo tiene bloqueado. El PID lo sacas de ps o de top.
Ver lo que abrió un usuario
| N.º | Pieza | Tipo | Qué hace |
|---|---|---|---|
| 1 | lsof | Comando | El comando que lista los archivos y sockets abiertos. |
| 2 | -u | Opción | Filtra por usuario. |
| 3 | juan | Argumento | El usuario cuyos archivos abiertos quieres ver. |
Solo lo que pertenece a juan. Para archivos normales esto casi siempre funciona sin sudo, porque los procesos son suyos. Si necesitas ver también lo de los demás usuarios, ponle sudo delante.
Buscar por nombre de programa
| N.º | Pieza | Tipo | Qué hace |
|---|---|---|---|
| 1 | lsof | Comando | El comando que lista los archivos y sockets abiertos. |
| 2 | -c | Opción | Filtra por nombre de comando. |
| 3 | nginx | Valor | El nombre del programa que buscas. |
Todos los archivos y conexiones de los procesos que se llaman nginx, sin tener que conocer su PID. Ojo: el nombre se compara contra los primeros 15 caracteres del proceso, y por eso con -c se escriben sin la ruta completa.
Combinar dos filtros
| N.º | Pieza | Tipo | Qué hace |
|---|---|---|---|
| 1 | lsof | Comando | El comando que lista los archivos y sockets abiertos. |
| 2 | -a | Opción | Junta los filtros con Y: tienen que cumplirse todos. |
| 3 | -u | Opción | Filtra por usuario. |
| 4 | root | Argumento | El usuario que debe cumplir la condición. |
| 5 | -i | Opción | Restringe la búsqueda a conexiones de red. |
| 6 | :22 | Valor | El puerto 22, el de SSH. |
Solo el proceso de root que tiene abierto el puerto 22, que es justo el servidor sshd. Sin el -a, lsof juntaría los filtros con O y te devolvería todo lo de root más todo lo del puerto 22, que es una lista mucho más amplia de la que querías.
Opciones
Las que sí vas a usar| Opción | Qué hace |
|---|---|
| -i | Muestra solo conexiones de red. Acepta el filtro después, como :80 para un puerto, @1.2.3.4 para una dirección o TCP para el protocolo. |
| -P | Muestra los puertos con su número en vez de su nombre, para que no salga http en lugar de 80. |
| -n | No resuelve los nombres de dominio: la dirección IP se queda como número y es más rápida. |
| -u | Filtra por usuario: es lo que reduce una lista enorme a solo lo tuyo. |
| -p | Filtra por PID. Puedes pasar varios separados por comas. |
| -c | Filtra por nombre de comando, por ejemplo lsof -c nginx. |
| -a | Junta los filtros con Y en vez de con O. Sin esto, lsof muestra lo que cumpla cualquiera de ellos. |
| -t | Imprime solo los PID, sin las demás columnas. Sirve para pasarle el resultado a otro comando. |
Fallas comunes
| Falla | Remedio |
|---|---|
| Que lsof sin sudo no muestre nada. | Cada usuario solo puede ver sus propios procesos. Para averiguar quién tiene abierto el puerto de un servicio casi siempre hace falta root: sudo lsof -i :80. Si ya usaste sudo y sigue vacío, es que ese puerto no lo tiene nadie abierto. |
| Escribir lsof -i 80 sin los dos puntos. | El puerto se separa con dos puntos: lsof -i :80. Sin ellos lsof no encuentra nada y no avisa. También puedes indicar el protocolo: lsof -iTCP:80. |
| Combinar dos filtros esperando que se multipliquen. | Por omisión lsof junta los filtros con O, o sea cualquiera: lsof -u root -i :22 devuelve todo lo de root más todo lo del puerto 22. Para que se cumplan los dos, agrega -a: lsof -a -u root -i :22. |
| Esperar ver un puerto libre que aparece en ss o netstat. | Lo que ves en estado TIME_WAIT es una conexión a medio cerrar, no un proceso que esté bloqueando el puerto. lsof -i :80 solo muestra sockets abiertos, así que sale vacío mientras esa conexión no se borre. |
Preguntas frecuentes
- ¿Cómo veo qué proceso ocupa un puerto?
- Con lsof -i :PUERTO. Por ejemplo lsof -i :80 muestra el nombre del proceso, su PID y el socket que tiene abierto. Los dos puntos son obligatorios. Si necesitas solo el número, lsof -t -i :80 lo imprime sin las demás columnas.
- ¿Por qué lsof no me muestra nada sin sudo?
- Un usuario normal solo puede inspeccionar sus propios procesos. Los servicios como nginx, apache2 o sshd corren como root, así que para ver quién tiene abierto un puerto de servicio necesitas sudo lsof -i :PUERTO.
- ¿Cuál es la diferencia entre lsof y netstat?
- netstat muestra las conexiones y los puertos que están escuchando, pero no siempre dice qué proceso las tiene abiertas. lsof siempre da el nombre del proceso y el PID, y además lista archivos normales, que netstat no muestra. Para encontrar al culpable de un puerto, lsof es más directo.
- ¿Qué hace la opción -a de lsof?
- Cambia la manera de combinar los filtros. Sin -a, lsof los junta con O, así que muestra lo que cumpla cualquiera de ellos. Con -a los junta con Y y solo muestra lo que cumple todos: lsof -a -u root -i :22.
- ¿Cómo veo qué archivos tiene abiertos un proceso?
- Con lsof -p PID, por ejemplo lsof -p 1234. Ahí sale cada archivo con su tipo y su descriptor: txt para el ejecutable, cwd para la carpeta en la que corre y REG para archivos normales. También lo puedes ver desde htop con la tecla l.