Comandos LinuxExplicados en español
/
Ficha49 / 104
Categoría
Procesos
Ejemplos
6
Ver también
ss · netstat · ps · kill

lsof

list open files (listar archivos abiertos)

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.

Sintaxislsof [opciones] [archivo]
§ 1

Despiece

6 ejemplos
Ver quién ocupa un puerto

Ver quién ocupa un puerto

3 piezas
Lámina01 / 06
Comandolsof -i :80
Piezas3
Escala1:1
N.ºPiezaTipoQué hace
1lsofComandoEl comando que lista los archivos y sockets abiertos.
2-iOpciónRestringe la búsqueda a conexiones de red.
3:80ValorEl puerto que buscas, con los dos puntos de delante.
Resultado

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

5 piezas
Lámina02 / 06
Comandosudo lsof -i -P -n
Piezas5
Escala1:1
N.ºPiezaTipoQué hace
1sudoComandoEjecuta la orden como root, que es lo que hace falta para ver los procesos de todos los usuarios.
2lsofComandoEl comando que lista los archivos y sockets abiertos.
3-iOpciónMuestra solo las conexiones de red.
4-POpciónPuertos con número en lugar de con nombre.
5-nOpciónDirecciones sin resolver a nombres de dominio.
Resultado

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

3 piezas
Lámina03 / 06
Comandolsof -p 1234
Piezas3
Escala1:1
N.ºPiezaTipoQué hace
1lsofComandoEl comando que lista los archivos y sockets abiertos.
2-pOpciónFiltra por número de proceso.
31234ValorEl PID del proceso que quieres inspeccionar.
Resultado

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

3 piezas
Lámina04 / 06
Comandolsof -u juan
Piezas3
Escala1:1
N.ºPiezaTipoQué hace
1lsofComandoEl comando que lista los archivos y sockets abiertos.
2-uOpciónFiltra por usuario.
3juanArgumentoEl usuario cuyos archivos abiertos quieres ver.
Resultado

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

3 piezas
Lámina05 / 06
Comandolsof -c nginx
Piezas3
Escala1:1
N.ºPiezaTipoQué hace
1lsofComandoEl comando que lista los archivos y sockets abiertos.
2-cOpciónFiltra por nombre de comando.
3nginxValorEl nombre del programa que buscas.
Resultado

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

6 piezas
Lámina06 / 06
Comandolsof -a -u root -i :22
Piezas6
Escala1:1
N.ºPiezaTipoQué hace
1lsofComandoEl comando que lista los archivos y sockets abiertos.
2-aOpciónJunta los filtros con Y: tienen que cumplirse todos.
3-uOpciónFiltra por usuario.
4rootArgumentoEl usuario que debe cumplir la condición.
5-iOpciónRestringe la búsqueda a conexiones de red.
6:22ValorEl puerto 22, el de SSH.
Resultado

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.

§ 2

Opciones

Las que sí vas a usar
OpciónQué hace
-iMuestra 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.
-PMuestra los puertos con su número en vez de su nombre, para que no salga http en lugar de 80.
-nNo resuelve los nombres de dominio: la dirección IP se queda como número y es más rápida.
-uFiltra por usuario: es lo que reduce una lista enorme a solo lo tuyo.
-pFiltra por PID. Puedes pasar varios separados por comas.
-cFiltra por nombre de comando, por ejemplo lsof -c nginx.
-aJunta los filtros con Y en vez de con O. Sin esto, lsof muestra lo que cumpla cualquiera de ellos.
-tImprime solo los PID, sin las demás columnas. Sirve para pasarle el resultado a otro comando.
§ 3

Fallas comunes

FallaRemedio
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.
§ 4

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.
§ 5

Ver también