lsof es una potente utilidad disponible para Linux y sistemas basados en Unix que literalmente significa ‘lista (de) archivos abiertos’.

Su función principal es recuperar detalles sobre varios tipos de archivos abiertos por diferentes procesos en ejecución. Estos archivos pueden ser archivos normales, directorios, archivos de bloque, sockets de red, tuberías con nombre, etc.

Con lsof, puede encontrar diferentes procesos bloqueando un archivo o directorio, un proceso escuchando en un puerto, la lista de procesos de un usuario, qué archivos está bloqueando un proceso. Primero cubriremos su instalación y luego algunos ejemplos de uso común en este artículo.

Instalación de lsof

lsof no está disponible por defecto en la mayoría de las distribuciones de Linux pero puede instalarse fácilmente. Utilice el siguiente comando para instalar lsof:

CentOS / RHEL / Fedora:

$ sudo yum install lsof

para CentOS/RHEL 8, puede utilizar el comando DNF

$ sudo dnf install lsof

Ubuntu / Debian:

$ sudo apt install lsof

Obtener ayuda

Puede obtener una lista resumida de las opciones soportadas por lsof utilizando la bandera -? o -h.

$ lsof -?
lsof 4.87
 última revisión: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
 última FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
 última página man: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
 uso: [-?abhKlnNoOPRtUvVX] [ |-c c] [ |-d s] [ D D] [ |-f[gG]] [ |-e s]
 [-F <x>[f</x>]] [-g <x>[</x>s]] [-i [i]] [ |-L <x>[l</x>]] [ m <x>[</x>m]] [ |-M] [-o [ o]] [-p s]
[ |-r <x><x><x>[</x></x></x>t]] [-s [p:s]] [-S <x><x><x>[</x></x></x>t]] [-T <x><x><x>[</x></x></x>t]] [-u s] [ |-w] [-x <x>[fl</x>]] [-Z [Z]] [--] [ nombres]
Valores predeterminados entre paréntesis; conjunto (s) de elementos separados por comas; rangos separados por guiones.
  -?|-h listar ayuda -a selecciones AND (OR) -b evitar bloques del núcleo
  -c c cmd c ^c /c/[bix] c w COMANDO ancho (9) d s dir s archivos
  -d s select by FD set D D dir D tree *SLOW?* |-e s exempt s *RISKY*
  -i select IPv<x><x>[46]</x></x> files -K list tasKs (threads) -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 -terse listing -T disable TCP/TPI info
  -U select Unix socket -v list version info -V verbose search
   |-w advertencias ( ) -X omitir archivos TCP&UDP* -Z contexto [Z]
  -- opción de fin de búsqueda
   f|-f sistema de archivos o -nombres de archivos |-f[gG] flaGs
  -F <x>[</x> f] seleccionar campos; -F? para ayuda
   |-L <x>[l</x> ] lista ( ) suprimir (-) recuentos de enlaces < l (0 = todos; por defecto = 0)
                                         m <x>[</x> m] usar|crear suplemento de montaje
   |-M portMap registro (-) -o o o 0t desplazamiento dígitos (8)
  -p s exclude(^)|select PIDs -S <x><x><x>[t</x></x></x> ] t second stat timeout (15)
  -T qs TCP/TPI Q,St (s) info
  -g <x>[</x> s] exclude(^)|select and print process group IDs
  -i i seleccionar por dirección IPv<x><x>[</x></x> 46]: [46 <x><x>]</x></x>[proto][@host|addr][:svc_list|port_list]
   |-r [t[m<fmt>]] repetir cada t segundos (15); hasta que no haya archivos, - para siempre.
       Un sufijo opcional de t es m<fmt>; m debe separar t de <fmt> y
      <fmt> es un formato strftime(3) para la línea marcadora.
  -s p:s exclude(^)|selecciona estados de protocolo (p = TCP|UDP) por nombre(s).
  -u s exclude(^)|select login|UID set s
  -x <x>[fl</x> ] cruzar d| D sistemas de archivos o enlaces simbólicos
  names selecciona archivos con nombre o archivos en sistemas de archivos con nombre
Cualquiera puede listar todos los archivos; advertencias de /dev desactivadas; comprobación de ID del kernel desactivada.
$

Para comprobar la información detallada de la versión instalada, utilice

$ lsof -v
lsof información de versión:
    revisión: 4.87
    última revisión: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
    última FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
    última página man: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
    construido: Mar Oct 30 16:28:19 UTC 2018
    construido por y en: mockbuild@x86-01.bsys.centos.org
    compilador: cc
    versión del compilador: 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
    banderas del compilador: -DLINUXV=310000 -DGLIBCV=217 -DHASIPv6 -DHASSELINUX -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -DHAS_STRFTIME -DLSOF_VSTR="3.10.0" -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic
    banderas del cargador: -L./lib -llsof -lselinux
    información del sistema: Linux x86-01.bsys.centos.org 3.10.0-693.17.1.el7.x86_64 #1 SMP Thu Jan 25 20:13:58 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
    Cualquiera puede listar todos los archivos.
    las advertencias de /dev están deshabilitadas.
    La comprobación del ID del kernel está desactivada.
$

Campos de salida

la estructura de los campos de salida de lsof por defecto es como:

COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME

La mayoría de estos campos se explican por sí mismos, excepto los campos FD y TYPE que son en cierto modo exclusivos de lsof y serán explorados brevemente.

FD se refiere al número del Descriptor de Fichero del fichero y TYPE se refiere al tipo del nodo asociado al fichero. A continuación revisaremos los valores admitidos para estos dos campos.

El campoFD puede contener los siguientes valores

cwd directorio de trabajo actual;
Lnn referencias de biblioteca (AIX);
err error de información FD (véase la columna NOMBRE);
jld directorio de la jaula (FreeBSD);
ltx texto de biblioteca compartida (código y datos);
Mxx hex tipo mapeado en memoria número xx.
m86 DOS archivo mapeado en memoria;
mem archivo mapeado en memoria;
mmap dispositivo mapeado en memoria
pd directorio padre
rtd directorio raíz;
tr fichero de trazas del kernel (OpenBSD);
txt texto de programa (código y datos);
v86 archivo mapeado VP/ix;

El campoFD va seguido de uno o varios caracteres que describen el modo en el que está abierto el fichero:

r para acceso de lectura
w para acceso de escritura
u para acceso de lectura y escritura;
espacio si se desconoce el modo y no sigue ningún carácter de bloqueo;
`-' si se desconoce el modo y le sigue un carácter de bloqueo.

El carácter de modo para FD puede ir seguido de un carácter de BLOQUEO cuya descripción se da a continuación:

N para un bloqueo NFS de Solaris de tipo desconocido;
r para un bloqueo de lectura sobre una parte del fichero;
R para un bloqueo de lectura en todo el archivo;
w para un bloqueo de escritura sobre una parte del fichero;
W para un bloqueo de escritura en todo el archivo;
u para un bloqueo de lectura y escritura de cualquier longitud;
U para un bloqueo de tipo desconocido;
x para un bloqueo SCO OpenServer Xenix en parte del fichero;
X para un bloqueo SCO OpenServer Xenix en todo el fichero;
espacio si no hay bloqueo.

Del mismo modo, el campo TYPE puede contener GDIR, GREG, VDIR, VREG, IPV4, IPV6, etc. Para obtener una lista completa de los TIPOS soportados en lsof, consulte su página de manual.

Uso común

A continuación se muestran algunos de los usos más comunes del comando lsof. El comando funciona en todas las variantes de Linux y todos los argumentos de línea de comandos listados a continuación de los ejemplos deberían funcionar en todas las plataformas, considerando la misma versión de lsof.

Listar todos los archivos abiertos

Ejecutar lsof sin ninguna opción listará todos los archivos que están actualmente abiertos por procesos activos.

$ sudo lsof | less

Salida:

COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 224 64 /
systemd 1 root rtd DIR 253,0 224 64 /
systemd 1 root txt REG 253,0 1632776 308905 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,0 20064 16063 /usr/lib64/libuuid.so.1.3.0
systemd 1 root mem REG 253,0 265576 186547 /usr/lib64/libblkid.so.1.1.0
systemd 1 root mem REG 253,0 90248 16051 /usr/lib64/libz.so.1.2.7
systemd 1 root mem REG 253,0 157424 16059 /usr/lib64/liblzma.so.5.2.2
systemd 1 root mem REG 253,0 23968 59696 /usr/lib64/libcap-ng.so.0.0.0
systemd 1 root mem REG 253,0 19896 59686 /usr/lib64/libattr.so.1.1.0
systemd 1 root mem REG 253,0 19248 15679 /usr/lib64/libdl-2.17.so
systemd 1 root mem REG 253,0 402384 16039 /usr/lib64/libpcre.so.1.2.0
systemd 1 root mem REG 253,0 2156272 15673 /usr/lib64/libc-2.17.so
systemd 1 root mem REG 253,0 142144 15699 /usr/lib64/libpthread-2.17.so
systemd 1 root mem REG 253,0 88720 84 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
systemd 1 root mem REG 253,0 43712 15703 /usr/lib64/librt-2.17.so
systemd 1 root mem REG 253,0 277808 229793 /usr/lib64/libmount.so.1.1.0
systemd 1 root mem REG 253,0 91800 76005 /usr/lib64/libkmod.so.2.2.10
systemd 1 root mem REG 253,0 127184 59698 /usr/lib64/libaudit.so.1.0.0
systemd 1 root mem REG 253,0 61680 229827 /usr/lib64/libpam.so.0.83.1
systemd 1 root mem REG 253,0 20048 59690 /usr/lib64/libcap.so.2.22
systemd 1 root mem REG 253,0 155744 16048 /usr/lib64/libselinux.so.1

Lista por nombre de archivo

Para listar todos los procesos que han abierto un archivo específico, podemos especificar nombre-archivo como argumento:

$ sudo lsof {nombre-archivo}

Salida:

$ sudo lsof /var/log/messages
COMANDO PID USUARIO FD TIPO DISPOSITIVO TAMAÑO/OFF NOMBRE DE NODO
rsyslogd 1000 root 6w REG 253,0 205 16777741 /var/log/messages
$

Lista los archivos abiertos por nombre de usuario

En un sistema multiusuario, puede filtrar la lista de ficheros por procesos específicos propiedad de usuarios, utilizando la bandera -u seguida del nombre de usuario.

$ sudo lsof -u {nombredeusuario}

Salida:

$ sudo lsof -u abhisheknair
COMANDO PID USUARIO FD TIPO DISPOSITIVO TAMAÑO/OFF NOMBRE DE NODO
sshd 1239 abhisheknair cwd DIR 253,0 224 64 /
sshd 1239 abhisheknair rtd DIR 253,0 224 64 /
sshd 1239 abhisheknair txt REG 253,0 852856 425229 /usr/sbin/sshd
sshd 1239 abhisheknair mem REG 253,0 15488 17204727 /usr/lib64/security/pam_lastlog.so
sshd 1239 abhisheknair mem REG 253,0 15648 229829 /usr/lib64/libpam_misc.so.0.82.0
sshd 1239 abhisheknair mem REG 253,0 309248 17303270 /usr/lib64/security/pam_systemd.so
sshd 1239 abhisheknair mem REG 253,0 19616 17204728 /usr/lib64/security/pam_limits.so
sshd 1239 abhisheknair mem REG 253,0 11168 17204726 /usr/lib64/security/pam_keyinit.so
sshd 1239 abhisheknair mem REG 253,0 40800 17204735 /usr/lib64/security/pam_namespace.so

Alternativamente, si desea listar los archivos abiertos por cualquier usuario excepto uno específico, utilice la bandera -u seguida de ^username como se muestra a continuación:

$ sudo lsof -u ^{nombredeusuario}

Salida:

$ sudo lsof -u ^root
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dbus-daem 630 dbus cwd DIR 253,0 224 64 /
dbus-daem 630 dbus rtd DIR 253,0 224 64 /
dbus-daem 630 dbus txt REG 253,0 223232 50590133 /usr/bin/dbus-daemon
dbus-daem 630 dbus mem REG 253,0 61560 15691 /usr/lib64/libnss_files-2.17.so
dbus-daem 630 dbus mem REG 253,0 68192 59651 /usr/lib64/libbz2.so.1.0.6
dbus-daem 630 dbus mem REG 253,0 90248 16051 /usr/lib64/libz.so.1.2.7
dbus-daem 630 dbus mem REG 253,0 99944 59680 /usr/lib64/libelf-0.176.so
dbus-daem 630 dbus mem REG 253,0 19896 59686 /usr/lib64/libattr.so.1.1.0
dbus-daem 630 dbus mem REG 253,0 402384 16039 /usr/lib64/libpcre.so.1.2.0

Una forma en la que puede utilizar lsof es para situaciones en las que desee matar todos los procesos de un usuario específico rápidamente en un único comando. Podemos combinar kill con lsof como se muestra en el siguiente ejemplo para conseguirlo (ejecutar como root):

# kill -9 `lsof -t -u {nombredeusuario}``

Como se ve en el ejemplo anterior, podemos utilizar la bandera -t para filtrar el resto de la información excepto el process-id. Esto puede ser útil en automatización y scripting como se muestra en el ejemplo anterior combinándolo con el comando kill.

$ sudo lsof -t -u {nombredeusuario}

Salida:

$ sudo lsof -t -u abhisheknair
1239
1240
$

Con lsof, podemos combinar múltiples argumentos utilizando la lógica OR como se muestra a continuación:

$ sudo lsof -u {nombredeusuario} -c {nombredelproceso}

Salida:

$ sudo lsof -u ftpuser -c bash
COMANDO PID USUARIO FD TIPO DISPOSITIVO TAMAÑO/APAGADO NOMBRE DE NODO
bash 1240 abhisheknair cwd DIR 253,0 120 510681 /home/abhisheknair
bash 1240 abhisheknair rtd DIR 253,0 224 64 /
bash 1240 abhisheknair txt REG 253,0 964536 50548532 /usr/bin/bash
bash 1240 abhisheknair mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
bash 1240 abhisheknair mem REG 253,0 61560 15691 /usr/lib64/libnss_files-2.17.so
bash 1240 abhisheknair mem REG 253,0 2156272 15673 /usr/lib64/libc-2.17.so
bash 1240 abhisheknair mem REG 253,0 19248 15679 /usr/lib64/libdl-2.17.so
bash 1240 abhisheknair mem REG 253,0 174576 16034 /usr/lib64/libtinfo.so.5.9
bash 1240 abhisheknair mem REG 253,0 163312 15666 /usr/lib64/ld-2.17.so
bash 1240 abhisheknair mem REG 253,0 26970 16003 /usr/lib64/gconv/gconv-modules.cache
bash 1240 abhisheknair 0u CHR 136,0 0t0 3 /dev/pts/0
bash 1240 abhisheknair 1u CHR 136,0 0t0 3 /dev/pts/0
bash 1240 abhisheknair 2u CHR 136,0 0t0 3 /dev/pts/0
bash 1240 abhisheknair 255u CHR 136,0 0t0 3 /dev/pts/0
bash 1425 ftpuser cwd DIR 253,0 182 33578272 /home/ftpuser
bash 1425 ftpuser rtd DIR 253,0 224 64 /
bash 1425 ftpuser txt REG 253,0 964536 50548532 /usr/bin/bash
bash 1425 ftpuser mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
bash 1425 ftpuser mem REG 253,0 61560 15691 /usr/lib64/libnss_files-2.17.so
bash 1425 ftpuser mem REG 253,0 2156272 15673 /usr/lib64/libc-2.17.so
bash 1425 ftpuser mem REG 253,0 19248 15679 /usr/lib64/libdl-2.17.so
bash 1425 ftpuser mem REG 253,0 174576 16034 /usr/lib64/libtinfo.so.5.9
bash 1425 ftpuser mem REG 253,0 163312 15666 /usr/lib64/ld-2.17.so
bash 1425 ftpuser mem REG 253,0 26970 16003 /usr/lib64/gconv/gconv-modules.cache
bash 1425 ftpuser 0u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 1u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 2u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 255u CHR 4,1 0t0 1043 /dev/tty1
$

Alternativamente, si desea utilizar la condición lógica AND utilice la bandera -a.

$ sudo lsof -u {nombredeusuario} -c {nombredelproceso} -a

Salida:

$ sudo lsof -u ftpuser -c bash -a
COMANDO PID USUARIO FD TIPO DISPOSITIVO TAMAÑO/APAGADO NOMBRE DE NODO
bash 1425 ftpuser cwd DIR 253,0 182 33578272 /home/ftpuser
bash 1425 ftpuser rtd DIR 253,0 224 64 /
bash 1425 ftpuser txt REG 253,0 964536 50548532 /usr/bin/bash
bash 1425 ftpuser mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
bash 1425 ftpuser mem REG 253,0 61560 15691 /usr/lib64/libnss_files-2.17.so
bash 1425 ftpuser mem REG 253,0 2156272 15673 /usr/lib64/libc-2.17.so
bash 1425 ftpuser mem REG 253,0 19248 15679 /usr/lib64/libdl-2.17.so
bash 1425 ftpuser mem REG 253,0 174576 16034 /usr/lib64/libtinfo.so.5.9
bash 1425 ftpuser mem REG 253,0 163312 15666 /usr/lib64/ld-2.17.so
bash 1425 ftpuser mem REG 253,0 26970 16003 /usr/lib64/gconv/gconv-modules.cache
bash 1425 ftpuser 0u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 1u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 2u CHR 4,1 0t0 1043 /dev/tty1
bash 1425 ftpuser 255u CHR 4,1 0t0 1043 /dev/tty1
$

Listar archivos abiertos por proceso

También podemos listar los ficheros abiertos por un proceso concreto utilizando la opción -c seguida del nombre del proceso.

$ sudo lsof -c {nombre-del-proceso}

Salida:

$ sudo lsof -c ssh
COMANDO PID USUARIO FD TIPO DISPOSITIVO TAMAÑO/OFF NOMBRE DE NODO
sshd 997 root cwd DIR 253,0 224 64 /
sshd 997 root rtd DIR 253,0 224 64 /
sshd 997 root txt REG 253,0 852856 425229 /usr/sbin/sshd
sshd 997 root mem REG 253,0 61560 15691 /usr/lib64/libnss_files-2.17.so
sshd 997 root mem REG 253,0 68192 59651 /usr/lib64/libbz2.so.1.0.6
sshd 997 root mem REG 253,0 99944 59680 /usr/lib64/libelf-0.176.so
sshd 997 root mem REG 253,0 19896 59686 /usr/lib64/libattr.so.1.1.0
sshd 997 root mem REG 253,0 15688 75906 /usr/lib64/libkeyutils.so.1.5
sshd 997 root mem REG 253,0 67104 186525 /usr/lib64/libkrb5support.so.0.1

Lista de archivos abiertos por PID

Alternativamente, para listar los archivos abiertos por un proceso pero en lugar de process-name desea especificar su ID, puede utilizar la bandera -p seguida de process-id.

$ sudo lsof -p {id-proceso}

Salida:

$ sudo lsof -p 663
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
firewalld 663 root cwd DIR 253,0 224 64 /
firewalld 663 root rtd DIR 253,0 224 64 /
firewalld 663 root txt REG 253,0 7144 50491220 /usr/bin/python2.7
firewalld 663 root mem REG 253,0 298828 50617647 /usr/lib64/girepository-1.0/NM-1.0.typelib
firewalld 663 root mem REG 253,0 343452 50507562 /usr/lib64/girepository-1.0/Gio-2.0.typelib
firewalld 663 root mem REG 253,0 12352 17202092 /usr/lib64/python2.7/lib-dynload/grpmodule.so
firewalld 663 root mem REG 253,0 29184 17202105 /usr/lib64/python2.7/lib-dynload/selectmodule.so
firewalld 663 root mem REG 253,0 168312 388240 /usr/lib64/libdbus-glib-1.so.2.2.2
firewalld 663 root mem REG 253,0 11976 34028597 /usr/lib64/python2.7/site-packages/_dbus_glib_bindings.so
firewalld 663 root mem REG 253,0 185712 50507559 /usr/lib64/girepository-1.0/GLib-2.0.typelib
  • Si desea listar todos los archivos abiertos excepto los abiertos por un proceso concreto, utilice -p seguido de ^process-id.
$ sudo lsof -p ^{process-id}

Listar los archivos abiertos que contienen el directorio

Para listar los procesos que abrieron archivos bajo un directorio específico, utilice la opción D seguida de la ruta del directorio.

$ sudo lsof D {ruta}

Salida:

$ sudo lsof D /var/log
COMANDO PID USUARIO FD TIPO DISPOSITIVO TAMAÑO/APAGADO NOMBRE DE NODO
auditd 607 root 5w REG 253,0 1065095 425227 /var/log/audit/audit.log
firewalld 663 root 3w REG 253,0 13817 17663786 /var/log/firewalld
tuned 999 root 3w REG 253,0 13395 33574994 /var/log/tuned/tuned.log
rsyslogd 1000 root 6w REG 253,0 4302 16777753 /var/log/cron
rsyslogd 1000 root 7w REG 253,0 64740 16777755 /var/log/messages
rsyslogd 1000 root 8w REG 253,0 5513 16787904 /var/log/secure
rsyslogd 1000 root 9w REG 253,0 198 16777754 /var/log/maillog
$

Si no desea listar recursivamente archivos dentro de subdirectorios, utilice la bandera -d seguida de la ruta del directorio.

$ sudo lsof d {ruta}

Salida:

$ sudo lsof d /var/log
COMANDO PID USUARIO FD TIPO DISPOSITIVO TAMAÑO/OFF NOMBRE DE NODO
firewalld 663 root 3w REG 253,0 13817 17663786 /var/log/firewalld
rsyslogd 1000 root 6w REG 253,0 4302 16777753 /var/log/cron
rsyslogd 1000 root 7w REG 253,0 64740 16777755 /var/log/messages
rsyslogd 1000 root 8w REG 253,0 5833 16787904 /var/log/secure
rsyslogd 1000 root 9w REG 253,0 198 16777754 /var/log/maillog
$

Repetir modo

lsof puede ejecutarse en modo de repetición. En modo de repetición, lsof generará e imprimirá la salida a intervalos regulares. De nuevo, hay dos modos de repetición soportados por lsof, es decir, con banderas -r y r. Con la bandera -r, lsof repite la ejecución hasta que recibe una señal de interrupción/desactivación del usuario, mientras que con la bandera r, el modo de repetición de lsof finalizará en cuanto su salida no tenga ningún archivo abierto. Además, podemos especificar el tiempo de retardo con la bandera -r o r.

$ sudo lsof {argumentos} -r{intervalo de tiempo}

Salida:

$ sudo lsof -u ftpuser -c bash D /usr/lib -a -r3
COMANDO PID USUARIO FD TIPO DISPOSITIVO TAMAÑO/OFF NOMBRE DE NODO
bash 1425 ftpuser mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
=======
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1425 ftpuser mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
=======
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1425 ftpuser mem REG 253,0 106172832 50548523 /usr/lib/locale/locale-archive
=======

Listar archivos abiertos con protocolo de red

lsof soporta el listado de cualquier tipo de ficheros Linux que incluya conexiones de red, etc. Como tal, podemos listar los detalles de las conexiones de red abiertas utilizando la bandera -i.

$ sudo lsof -i

Salida:

$ sudo lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
chronyd 639 chrony 5u IPv4 14333 0t0 UDP localhost:323
chronyd 639 chrony 6u IPv6 14334 0t0 UDP localhost:323
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
master 1229 root 13u IPv4 18129 0t0 TCP localhost:smtp (LISTEN)
master 1229 root 14u IPv6 18130 0t0 TCP localhost:smtp (LISTEN)
sshd 1235 root 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
sshd 1239 abhisheknair 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
$

Para listar todas las conexiones de red en uso por un process-id específico, puede utilizar lsof como:

$ sudo lsof -i -a -p {process-id}

Salida:

$ sudo lsof -i -a -p 997
COMANDO PID USUARIO FD TIPO DISPOSITIVO TAMAÑO/OFF NOMBRE DE NODO
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
$

O para listar todas las conexiones de red en uso por un proceso específico, podemos dar process-name como:

$ sudo lsof -i -a -c {nombre-proceso}

Salida:

$ sudo lsof -i -a -c ssh
COMANDO PID USUARIO FD TIPO DISPOSITIVO TAMAÑO/OFF NOMBRE DE NODO
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
sshd 1235 root 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
sshd 1239 abhisheknair 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
$

Podemos filtrar la salida de lsof con la bandera -i por tipo de protocolo de red, es decir, TCP o UDP especificando el tipo de protocolo.

$ sudo lsof -i {protocolo}

Salida:

$ sudo lsof -i tcp
COMANDO PID USUARIO FD TIPO DISPOSITIVO TAMAÑO/OFF NOMBRE DE NODO
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
master 1229 root 13u IPv4 18129 0t0 TCP localhost:smtp (LISTEN)
master 1229 root 14u IPv6 18130 0t0 TCP localhost:smtp (LISTEN)
sshd 1235 root 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
sshd 1239 abhisheknair 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
$

O

Salida:

$ sudo lsof -i udp
COMANDO PID USUARIO FD TIPO DISPOSITIVO TAMAÑO/OFF NOMBRE NODO
chronyd 639 chrony 5u IPv4 14333 0t0 UDP localhost:323
chronyd 639 chrony 6u IPv6 14334 0t0 UDP localhost:323
$

Lista de archivos abiertos por puerto

También podemos filtrar la salida de lsof con la bandera -i por número de puerto utilizando la sintaxis de comando que se muestra a continuación:

$ sudo lsof -i :{número-de-puerto}

Salida:

$ sudo lsof -i :22
COMANDO PID USUARIO FD TIPO DISPOSITIVO TAMAÑO/OFF NOMBRE DE NODO
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
sshd 1235 root 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
sshd 1239 abhisheknair 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
$

Lista de archivos abiertos por IPv4/IPv6

Existe una opción para filtrar el listado de conexiones de red limitándolo a IPv4 o IPv6. Utilice la siguiente sintaxis de comando para obtener sólo el listado IP v4:

$ sudo lsof -i4

Salida:

$ sudo lsof -i4
COMANDO PID USUARIO FD TIPO DISPOSITIVO TAMAÑO/APAGADO NOMBRE DE NODO
chronyd 639 chrony 5u IPv4 14333 0t0 UDP localhost:323
sshd 997 root 3u IPv4 17330 0t0 TCP *:ssh (LISTEN)
master 1229 root 13u IPv4 18129 0t0 TCP localhost:smtp (LISTEN)
sshd 1235 root 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
sshd 1239 abhisheknair 3u IPv4 18318 0t0 TCP centos7vm:ssh->192.168.1.61:23566 (ESTABLISHED)
$

O para obtener sólo los detalles de IPv6, utilice

$ sudo lsof -i6

Salida:

$ sudo lsof -i6
COMANDO PID USUARIO FD TIPO DISPOSITIVO TAMAÑO/APAGADO NOMBRE DE NODO
chronyd 639 chrony 6u IPv6 14334 0t0 UDP localhost:323
sshd 997 root 4u IPv6 17339 0t0 TCP *:ssh (LISTEN)
master 1229 root 14u IPv6 18130 0t0 TCP localhost:smtp (LISTEN)
$

Lista de archivos abiertos en NFS

lsof también puede listar todos los archivos NFS actualmente abiertos por un usuario.

$ sudo lsof -N -u abhisheknair -a

Listar archivos borrados bloqueados

A veces ocurre que los archivos se borran en Linux pero siguen bloqueados por uno o más procesos. Como tal, esos archivos no se listan en el listado normal del sistema de archivos usando el comando ls, etc. pero siguen consumiendo espacio en disco como informa la salida de df, esto ocurre especialmente para archivos grandes borrados a propósito para despejar espacio en disco sin liberar el bloqueo del proceso. Puede encontrar tales procesos utilizando lsof como:

$ sudo lsof {ruta} | grep deleted

Salida:

$ sudo lsof / | grep deleted
firewalld 654 root 8u REG 253,0 4096 16777726 /tmp/#16777726 (borrado)
tuned 968 root 8u REG 253,0 4096 16777720 /tmp/#16777720 (borrado)
$

Conclusión

lsof ofrece una serie de opciones para personalizar su salida según sus necesidades. Es una utilidad útil en las tareas cotidianas de administración de sistemas y redes. La posibilidad de combinar diferentes argumentos juntos lo hace aún más útil y le permite obtener la salida requerida fácilmente. Consulte la página man de lsof para conocer todos los argumentos admitidos y su uso.

$ man lsof