Supongo que en algún momento te habrás preguntado si hay alguna forma de mostrar los archivos abiertos por un proceso o un usuario. Lo bueno es que la respuesta a esa pregunta es lsof command.
Probablemente ya sepa que el comando ls es la abreviatura de 'lista'. lsof significa 'Lista de archivos abiertos'. Y eso es exactamente lo que hace, enumerar los archivos abiertos por procesos, usuarios e ID de procesos.
Déjame mostrarte algunos de los usos más comunes del comando lsof.
ejemplos de comandos lsof
Si usa el comando lsof sin opciones ni argumentos, enumerará todos los archivos abiertos por todos los procesos en el sistema.
lsof
La salida debería ser así:
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 252,1 4096 2 /
systemd 1 root rtd DIR 252,1 4096 2 /
systemd 1 root txt REG 252,1 1595792 17384 /lib/systemd/systemd
systemd 1 root mem REG 252,1 1700792 2077 /lib/x86_64-linux-gnu/libm-2.27.so
El resultado se explica por sí mismo en su mayoría, pero aún puede preguntarse acerca de las columnas FD y TYPE.
FD significa descriptor de archivo. Algunos de los valores comunes para FD son:
- cwd:directorio de trabajo actual
- txt:archivos de texto
- mem:archivo asignado a la memoria
- mmap:dispositivo de memoria asignada
- NÚMERO:el descriptor de archivo real. También tiene información sobre en qué permiso de archivo se abre.
TIPO es una obviedad. Especifica el tipo de archivo. Estos son algunos ejemplos:
- REG:archivo normal
- DIR – Directorio
- CHR:archivo especial de caracteres
- FIFO:primero en entrar, primero en salir
Confía en mí. No querrías ejecutar el comando lsof sin argumentos.
¿Por qué digo esto? Porque comenzará a inundar tu pantalla con miles de resultados.
Si ejecuto el comando lsof en un servidor Ubuntu y cuento el número de líneas con el comando wc, este es el resultado.
lsof | wc -l
11432
¡Sí! Así es. Hay más de once mil archivos abiertos por varios procesos en el sistema.
No te preocupes. El comando lsof es muy útil en la depuración porque puede ver qué procesos abren qué archivos y qué archivo abre qué proceso.
Si no ha iniciado sesión como root, la salida del comando lsof sería muy limitada. Es una buena idea usar sudo si ha iniciado sesión como usuario no root.
1. Listar todos los procesos que han abierto un archivo
Esto es simple. Solo necesita especificar la ruta al archivo.
lsof <path_to_file>
2. Listar todos los archivos abiertos por el usuario
Esto es útil en un entorno multiusuario. Puede enumerar todos los archivos abiertos por un determinado usuario de la siguiente manera:
lsof -u <user_name>
También puede especificar más de un usuario como este:
lsof -u user1, user2
o así:
lsof -u user1 -u user2
3. Listar todos los archivos abiertos en un directorio
Si se pregunta cuál de los archivos se ha abierto en un directorio determinado, puede usar el comando lsof con la opción +D.
lsof +D <path_to_directory>
La búsqueda es recursiva. Entonces listará todos los archivos abiertos en el directorio mencionado y todos sus subdirectorios.
4. Listar todos los archivos abiertos por un proceso
En este caso, debe conocer la identificación del proceso (pid). Si conoce la identificación del proceso, puede usar la opción -p del comando lsof para encontrar los archivos que abrió.
lsof -p <pid>
También puede especificar varios ID de proceso.
lsof -p pid1, pid2, pid3
5. Listar todos los archivos abiertos por un comando
Esto es especialmente útil en la depuración. Suponga que desea ver qué archivos usa el demonio http, solo necesita especificar el nombre del comando (httpd en nuestro ejemplo).
lsof -c <command>
6. Buscar abierto por un usuario y un comando o un proceso
Puede combinar opciones como usuario y comando y un proceso usando la opción –a. Piense en ello como el operador AND. Esto le brinda un filtro adicional mientras intenta restringir su búsqueda.
lsof -a -u user_name -c command_name
7. Enumere las conexiones de red y los puertos con el comando lsof
También puede usar el comando lsof para encontrar puertos abiertos o para encontrar qué proceso está usando un puerto.
Puede archivar todo tipo de puertos abiertos con la opción -i:
lsof -i
La salida puede verse así:
lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 920 root 3u IPv4 20507 0t0 TCP *:ssh (LISTEN)
sshd 920 root 4u IPv6 20535 0t0 TCP *:ssh (LISTEN)
docker-pr 1163 root 4u IPv6 21687 0t0 TCP *:https (LISTEN)
docker-pr 1175 root 4u IPv6 21717 0t0 TCP *:http (LISTEN)
sshd 7528 root 3u IPv4 39506588 0t0 TCP testing:ssh->212.91.91.19:58904 (ESTABLISHED)
systemd-r 10993 systemd-resolve 12u IPv4 20901990 0t0 UDP localhost:domain
systemd-r 10993 systemd-resolve 13u IPv4 20901991 0t0 TCP localhost:domain (LISTEN)
También puede especificar el tipo de conexión de red. Por ejemplo, para listar todos los puertos TCP abiertos, puede usar:
lsof -i tcp
Para encontrar qué proceso está utilizando un puerto específico, puede proporcionar el número de puerto:
lsof -i :<port_number>
Consejo extra:Uso del operador de negación con lsof
Puede usar el operador de negación para excluir a un usuario o proceso mientras usa el comando lsof.
Por ejemplo, si desea enumerar todos los archivos abiertos por un usuario que no sea root, utilícelo de esta manera:
lsof -u ^root
El comando lsof se vuelve aún más útil cuando lo usa con el comando grep.
Espero que hayas aprendido algo nuevo con este artículo. Si tiene preguntas o sugerencias, deje un comentario a continuación.