lsof significa "list open files" (en español "lista de archivos abiertos"), se utiliza en muchos sistemas tipo Unix para obtener una lista de todos los archivos abiertos y los procesos que los abrieron. También podrás utilizarlo para listar conexiones de forma similar a netstat o ss.
Esta utilidad de código abierto fue desarrollada y apoyada por Victor A. Abell, el Director Asociado retirado del Centro de Computación de la Universidad de Purdue. En la mayoría de las imágenes de Linux de Clouding viene instalado por defecto. Un equivalente de lsof en Windows sería handle y ListDLLs de las Sysinternals de Mark Russinovich (mediante GUI con Process Explorer).
A continuación, se muestran el índice con algunos ejemplos para su utilización y información relevante del comando lsof:
- Instalación de lsof
- Columnas de salida
- Ejemplos
- Listar todos los archivos abiertos por procesos
- Listar procesos por archivo
- Listar archivos abiertos por usuario
- Listar archivos abiertos por servicio
- Listar archivos abiertos por PID
- Listar conexiones por procesos
- Listar conexiones por PID, usuario o nombre de proceso
- Listar conexiones por puerto
- Listar conexiones IPv4 o IPv6
- Más información
Instalación de lsof
Para instalar lsof, simplemente puedes utilizar el administrador de paquetes de tu distribución:
# yum install lsof -y
# apt install lsof -y
Columnas de salida
La estructura de salida de lsof por defecto es la siguiente:
COMMAND | PID | TID | TASKCMD | USER | FD | TYPE | DEVICE | SIZE/OFF | NODE | NAME |
A continuación una breve explicación de todos los campos:
Nombre | Descripción |
---|---|
COMMAND | Contiene los primeros nueve caracteres del nombre del comando UNIX asociado al proceso. |
PID | Es el número de identificación del proceso. |
TID | Es el número de identificación de la tarea (hilo), en blanco indica un proceso (es decir, no tarea). |
TASKCMD | Es el nombre del comando de la tarea. |
ZONE | Es el nombre de la zona cuando se ha especificado -z. |
SECURITY-CONTEXT | Es el contexto de seguridad de SELinux cuando se ha especificado -Z. |
PPID | Es el número de identificación del proceso padre del proceso cuando se ha especificado -R. |
PGID | Es el número de identificación del grupo de procesos asociado al proceso cuando se ha especificado -g. |
USER | Es el número de identificación de usuario o el nombre de inicio de sesión del usuario al que pertenece el proceso. |
FD | Es el número de descriptor de archivo o directorio de trabajo actual (cwd), entre otros. Más información aquí. |
TYPE | Es el tipo de nodo asociado al archivo. Más información aquí. |
FILE-ADDR | Contiene la dirección de la estructura de archivos del núcleo cuando f se ha especificado en +f. |
FCT | Contiene el recuento de referencias a archivos de la estructura de archivos del kernel cuando se ha especificado c en +f. |
FILE-FLAG | Contiene el contenido del miembro f_flag[s] de la estructura de archivos del kernel entre otros cuando se ha especificado g o G en +f. Más información aquí. |
NODE-ID | Contiene un identificador único para el nodo del archivo cuando se ha especificado n en +f. |
DEVICE | Contiene los números de los dispositivos, separados por comas, para un carácter especial, bloque especial, regular, directorio o archivo NFS. |
SIZE, SIZE/OFF, or OFFSET | Es el tamaño del archivo o el desplazamiento del archivo en bytes. Más información aquí. |
NLINK | Contiene el recuento de enlaces de archivos cuando se ha especificado +L. |
NODE | Es el número de nodo de un archivo local o el número de inodo de un archivo NFS en el host del servidor entre otros. Más información aquí. |
NAME | Es el nombre del punto de montaje del sistema de archivos, el nombre de un dispositivo especial de caracteres, las direcciones de Internet de un archivo de red o el nombre del host local entre otros. Más información aquí. |
Ejemplos
Listar todos los archivos abiertos por procesos
Para listar todos los archivos abiertos, simplemente ejecuta lsof:
# lsof | less
Al añadir el comando less podrás visualizar el contenido más cómodamente.
Listar procesos por archivo
Para listar los procesos de un archivo abierto especifico, introduce la ruta y el archivo como argumento:
# lsof /ruta/archivo
Modifica "/ruta/archivo" por el archivo abierto deseado.
Listar archivos abiertos por usuario
Con el siguiente comando, podrás listar los archivos que tiene abierto un usuario en particular:
# lsof -u usuario
Modifica "usuario" por el usuario del sistema deseado.
Listar archivos abiertos por proceso
Para listar los archivos abiertos por un proceso, puedes utilizar su nombre de la siguiente forma:
# lsof -c nombre_proceso
Recuerda modificar "nombre_proceso" por el nombre del proceso en cuestión.
Listar archivos abiertos por PID
En caso de listar los archivos abiertos por PID del proceso, simplemente ejecuta:
# lsof -p numero_PID
Modifica "numero_PID" por el número identificador del proceso (puedes obtenerlo con el comando top).
Listar conexiones por procesos
Para listar las conexiones abiertas por procesos:
# lsof -i
Obtendrás un listado, puedes utilizar less para una mejor lectura.
Listar conexiones por PID, usuario o nombre de proceso
Podrás combinar la opción de listar conexiones, por ejemplo por el número identificador de un proceso:
# lsof -i -a -p numero_pid
También puedes utilizar otros argumentos como el usuario (-u), archivo o nombre de proceso (-c). Así como también filtrar por puerto o protocolo IP.
Listar conexiones por puerto
Para listar conexiones de un puerto determinado simplemente debes ejecutar:
# lsof -i :numero_puerto
Después de los dos puntos, añade el número del puerto en cuestión ("numero_puerto").
Listar conexiones IPv4 o IPv6
Listar conexiones IPv4:
# lsof -i4
Podrás utilizarlo en combinación con otros argumentos y para IPv6 sería:
# lsof -i6
Un ejemplo de combinación es el siguiente:
# lsof -i6 :numero_puerto
Obtendrías las conexiones IPv6 de un determinado puerto.
Más información
Como habrás observado, lsof es una herramienta muy útil y puedes combinarla con diferentes comandos. Un ejemplo sería utilizando Kill para matar todos los procesos de un resultado de lsof, un ejemplo de ello es matar todos los procesos de un usuario:
# kill -9 'lsof -t -u usuario'
También puedes combinar argumentos, el siguiente sería para mostrar archivos abiertos de un proceso determinado de un usuario:
# lsof -u usuario -c nombre_proceso
Por último, utilizando el argumento de ayuda (-h) obtendrás más información sobre lsof:
lsof 4.93.2
latest revision: https://github.com/lsof-org/lsof
latest FAQ: https://github.com/lsof-org/lsof/blob/master/00FAQ
latest (non-formatted) man page: https://github.com/lsof-org/lsof/blob/master/Lsof.8
usage: [-?abhKlnNoOPRtUvVX] [+|-c c] [+|-d s] [+D D] [+|-E] [+|-e s] [+|-f[gG]]
[-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+m [m]] [+|-M] [-o [o]] [-p s]
[+|-r [t]] [-s [p:s]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]
Defaults in parentheses; comma-separated set (s) items; dash-separated ranges.
-?|-h list help -a AND selections (OR) -b avoid kernel blocks
-c c cmd c ^c /c/[bix] +c w COMMAND width (9) +d s dir s files
-d s select by FD set +D D dir D tree *SLOW?* +|-e s exempt s *RISKY*
-i select IPv[46] files -K [i] list|(i)gn tasKs -l list UID numbers
-n no host names -N select NFS files -o list file offset
-O no overhead *RISKY* -P no port names -R list paRent PID
-s list file size -t terse listing -T disable TCP/TPI info
-U select Unix socket -v list version info -V verbose search
+|-w Warnings (+) -X skip TCP&UDP* files -Z Z context [Z]
-- end option scan
-E display endpoint info +E display endpoint info and files
+f|-f +filesystem or -file names +|-f[gG] flaGs
-F [f] select fields; -F? for help
+|-L [l] list (+) suppress (-) link counts < l (0 = all; default = 0)
+m [m] use|create mount supplement
+|-M portMap registration (-) -o o o 0t offset digits (8)
-p s exclude(^)|select PIDs -S [t] t second stat timeout (15)
-T qs TCP/TPI Q,St (s) info
-g [s] exclude(^)|select and print process group IDs
-i i select by IPv[46] address: [46][proto][@host|addr][:svc_list|port_list]
+|-r [t[m<fmt>]] repeat every t seconds (15); + until no files, - forever.
An optional suffix to t is m<fmt>; m must separate t from <fmt> and
<fmt> is an strftime(3) format for the marker line.
-s p:s exclude(^)|select protocol (p = TCP|UDP) states by name(s).
-u s exclude(^)|select login|UID set s
-x [fl] cross over +d|+D File systems or symbolic Links
names select named files or files on named file systems
Esperamos haberte ayudado con este artículo. Si te quedan dudas sobre esta u otra cuestión relacionada con tus servidores en Clouding, escríbenos a soporte@clouding.io. ¡Estamos para ayudarte! 😉