Comando lsof de Linux con ejemplos
El comando Lsof significa ‘Listar archivos abiertos’. Es muy útil conocer los detalles sobre los archivos que se han abierto y sus respectivos procesos. Con la ayuda de este comando, puede monitorear su sistema para ver lo que realmente está sucediendo y también averiguar los detalles sobre los archivos que están abiertos en algunas particiones en particular.
En este tutorial, enumero el uso común del comando lsof con ejemplos.
1) Lista de procesos abiertos por archivo específico
Para enumerar los procesos que fueron abiertos por algún archivo específico, simplemente ejecute el comando lsof seguido de la ruta del archivo. es decir, para ver los procesos abiertos por el archivo / var / log / messages, simplemente ejecute:
# lsof /var/log/messages
Salida de muestra:
# lsof /var/log/messages COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 1395 root 3w REG 202,0 59932 17322 /var/log/messages
2) Listar procesos usando un punto de montaje / partición
Al intentar desmontar alguna partición, es posible que haya visto el error «Dispositivo o recurso ocupado», esto sucede porque otros procesos todavía están usando esa partición o punto de montaje en particular. Necesitamos usar lsof para descubrir esos procesos y matarlos antes de desmontar con éxito la partición. Para ver qué procesos están usando alguna partición en particular, use el comando lsof seguido del nombre de la partición de la siguiente manera:
# lsof /run
Salida de muestra:
# lsof /run COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd-j 1065 root mem REG 0,17 6488064 1362725 /run/log/journal/72863e389b584a4dab36fae7f3bffda2/system.journal systemd-j 1065 root mem REG 0,17 8 810 /run/systemd/journal/kernel-seqnum systemd-j 1065 root 12u REG 0,17 6488064 1362725 /run/log/journal/72863e389b584a4dab36fae7f3bffda2/system.journal systemd-u 1078 root 6u REG 0,17 8 3703 /run/udev/queue.bin NetworkMa 1388 root 20w FIFO 0,17 0t0 3912 /run/systemd/inhibit/1.ref rsyslogd 1395 root mem REG 0,17 6488064 1362725 /run/log/journal/72863e389b584a4dab36fae7f3bffda2/system.journal
3) Lista de archivos abiertos por algunos usuarios específicos
Para ver la lista de archivos abiertos por algún usuario en particular, use la opción «-u» junto con lsof commad.
# lsof –u username # lsof -u root COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd DIR 202,0 4096 2 / systemd 1 root rtd DIR 202,0 4096 2 / systemd 1 root txt REG 202,0 1214424 9632 /usr/lib/systemd/systemd systemd 1 root mem REG 202,0 58288 17357 /usr/lib64/libnss_files-2.17.so systemd 1 root mem REG 202,0 90632 9967 /usr/lib64/libz.so.1.2.7 systemd 1 root mem REG 202,0 19888 9738 /usr/lib64/libattr.so.1.1.0 systemd 1 root mem REG 202,0 113320 17354 /usr/lib64/libnsl-2.17.so systemd 1 root mem REG 202,0 153184 9838 /usr/lib64/liblzma.so.5.0.99 systemd 1 root mem REG 202,0 398264 9898 /usr/lib64/libpcre.so.1.2.0 systemd 1 root mem REG 202,0 19512 17350 /usr/lib64/libdl-2.17.so systemd 1 root mem REG 202,0 2107600 9733 /usr/lib64/libc-2.17.so systemd 1 root mem REG 202,0 141616 9877 /usr/lib64/libpthread-2.17.so systemd 1 root mem REG 202,0 88720 17522 /usr/lib64/libgcc_s-4.8.2-20140120.so.1 systemd 1 root mem REG 202,0 304536 9762 /usr/lib64/libdbus-1.so.3.7.4 systemd 1 root mem REG 202,0 44048 17367 /usr/lib64/librt-2.17.so
4) Descubra los procesos que utilizan algún puerto en particular
Muchas veces nos encontramos con que algunos servicios no se pueden vincular a un puerto porque el puerto ya está siendo utilizado por otros procesos. En tales casos, es necesario encontrar ese proceso usando el puerto y matarlo. Aquí hay un ejemplo que puede ayudar:
# lsof -i :25
5) Lista de conexiones de red
Puede utilizar lsof para enumerar las conexiones de red. Utilice la ‘opción’ i ‘junto con lsof para ver estos detalles.
# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME avahi-dae 1383 avahi 12u IPv4 3397 0t0 UDP *:mdns avahi-dae 1383 avahi 13u IPv4 3398 0t0 UDP *:53376 chronyd 1393 chrony 1u IPv4 2712 0t0 UDP *:ntp chronyd 1393 chrony 2u IPv6 2713 0t0 UDP *:ntp chronyd 1393 chrony 3u IPv4 2714 0t0 UDP localhost:323 chronyd 1393 chrony 5u IPv6 2715 0t0 UDP localhost:323 dhclient 1497 root 6u IPv4 4179 0t0 UDP *:bootpc dhclient 1497 root 20u IPv4 4151 0t0 UDP *:24561 dhclient 1497 root 21u IPv6 4152 0t0 UDP *:20528 sshd 1707 root 3u IPv4 4897 0t0 TCP *:ssh (LISTEN) sshd 1707 root 4u IPv6 4908 0t0 TCP *:ssh (LISTEN) sshd 25453 root 3u IPv4 1601772 0t0 TCP li978-9.members.linode.com:ssh->182.188.228.74:casp (ESTABLISHED)
6) Encuentra archivos abiertos por algún demonio en particular.
Para mostrar todos los archivos abiertos por un demonio específico, use la opción ‘c’ con lsof seguido del nombre del demonio.
# lsof –c mysql mysqld 991 admin cwd DIR 8,3 240 148743 /home/admin/novell/idm/mysql/data mysqld 991 admin rtd DIR 8,3 536 2 / mysqld 991 admin txt REG 8,3 5464060 148691 /home/admin/novel/bin/mysqld mysqld 991 admin 0r CHR 1,3 41715 /dev/null mysqld 991 admin 1w REG 8,3 1250 149954 /home/admin/novell/mysql/mysql.log mysqld 991 admin 2w REG 8,3 1250 149954 /home/admin/novell/mysql/mysql.log mysqld 991 admin 3u IPv4 86990 TCP
7) Enumere todos los archivos abiertos por ID de proceso
Puede usar la opción ‘p’ junto con el comando lsof para averiguar la lista de archivos abiertos por cualquier proceso en particular.
# lsof -p PID
Reemplace PID con el ID del proceso.
# lsof -p 484 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME fsnotify_ 484 root cwd DIR 202,0 4096 2 / fsnotify_ 484 root rtd DIR 202,0 4096 2 / fsnotify_ 484 root txt unknown /proc/484/exe
8) Matar procesos para algún usuario en particular
Puede eliminar todos los procesos que pertenecen a algún usuario en particular usando el siguiente comando, reemplace USERNAME con su nombre de usuario real:
# kill -9 `lsof -t -u USERNAME
9) Descubra la asignación de puertos y servicios
Puede encontrar la asignación de puertos y sus servicios afiliados en un sistema Linux usando el comando lsof. El siguiente comando le mostrará los detalles de mapeo para los diversos servicios en ejecución y sus puertos asociados en la interfaz de red IPV4:
# lsof -Pnl +M -i4
# lsof -Pnl +M -i4 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME avahi-dae 1383 70 12u IPv4 3397 0t0 UDP *:5353 avahi-dae 1383 70 13u IPv4 3398 0t0 UDP *:53376 chronyd 1393 998 1u IPv4 2712 0t0 UDP *:123 chronyd 1393 998 3u IPv4 2714 0t0 UDP 127.0.0.1:323 dhclient 1497 0 6u IPv4 4179 0t0 UDP *:68 dhclient 1497 0 20u IPv4 4151 0t0 UDP *:24561 sshd 1707 0 3u IPv4 4897 0t0 TCP *:22 (LISTEN) sshd 25453 0 3u IPv4 1601772 0t0 TCP 45.33.24.9:22->182.188.228.74:1130 (ESTABLISHED) sshd 25549 0 3u IPv4 1602514 0t0 TCP 45.33.24.9:22->115.230.126.149:60138 (ESTABLISHED) sshd 25550 74 3u IPv4 1602514 0t0 TCP 45.33.24.9:22->115.230.126.149:60138 (ESTABLISHED)
El siguiente comando le mostrará información de mapeo para la interfaz de red IPV6:
# lsof -Pnl +M -i6
[root@localhost ~]# lsof -Pnl +M -i6 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME chronyd 1393 998 2u IPv6 2713 0t0 UDP *:123 chronyd 1393 998 5u IPv6 2715 0t0 UDP [::1]:323 dhclient 1497 0 21u IPv6 4152 0t0 UDP *:20528 sshd 1707 0 4u IPv6 4908 0t0 TCP *:22 (LISTEN) [root@localhost ~]# lsof -Pnl +M -i4
10) Encuentra el programa que se ejecuta en un puerto desconocido
Para verificar si hay puertos sospechosos en su sistema, simplemente ejecute el comando netstat.
# netstat –an udp 0 0 0.0.0.0:32853 0.0.0.0:* udp 0 0 0.0.0.0:56655 0.0.0.0:* udp 0 0 0.0.0.0:5500 0.0.0.0:* udp 0 0 0.0.0.0:78 0.0.0.0:*
En el resultado anterior, puede ver que el puerto 5500 es desconocido. Entonces, puede ubicar el programa usando el puerto con el siguiente comando:
# lsof -i udp:5500
11) Ver todas las conexiones TCP o UDP
Utilice el siguiente comando para ver las conexiones TCP y UDP en su sistema Linux:
# lsof -i tcp; lsof -i udp;
# lsof -i tcp; lsof -i udp; COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1707 root 3u IPv4 4897 0t0 TCP *:ssh (LISTEN) sshd 1707 root 4u IPv6 4908 0t0 TCP *:ssh (LISTEN) sshd 25453 root 3u IPv4 1601772 0t0 TCP li978-9.members.linode.com:ssh->182.188.228.74:casp (ESTABLISHED) COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME avahi-dae 1383 avahi 12u IPv4 3397 0t0 UDP *:mdns avahi-dae 1383 avahi 13u IPv4 3398 0t0 UDP *:53376 chronyd 1393 chrony 1u IPv4 2712 0t0 UDP *:ntp chronyd 1393 chrony 2u IPv6 2713 0t0 UDP *:ntp chronyd 1393 chrony 3u IPv4 2714 0t0 UDP localhost:323 chronyd 1393 chrony 5u IPv6 2715 0t0 UDP localhost:323 dhclient 1497 root 6u IPv4 4179 0t0 UDP *:bootpc dhclient 1497 root 20u IPv4 4151 0t0 UDP *:24561 dhclient 1497 root 21u IPv6 4152 0t0 UDP *:20528
12) Ejecute lsof en modo de repetición
También podemos ejecutar lsof en modo de repetición, lo que significa que mostrará los resultados una vez y luego tomará un descanso durante unos segundos y luego mostrará los resultados actualizados nuevamente en los intervalos mencionados. Es muy útil para solucionar problemas de rendimiento del sistema Linux.
Ejecute el comando lsof seguido de la opción «-r» y el intervalo de retraso en segundos. Encuentra a continuación un ejemplo
Vigile la actividad de los usuarios cada 3 segundos
# lsof -r 3 -u username
Conclusión
En este tutorial aprendimos cómo usar el comando lsof en Linux con ejemplos. Si tiene alguna pregunta o idea sobre este tutorial, utilice la sección de comentarios a continuación.