lsof significa Lista de archivos abiertos.
Es fácil recordar el comando lsof si piensa en él como "ls + of", donde ls significa lista y of significa archivos abiertos.
Es una utilidad de línea de comandos que se utiliza para enumerar la información sobre los archivos que varios procesos abren. En Unix, todo es un archivo (tuberías, sockets, directorios, dispositivos, etc.). Entonces, al usar lsof, puede obtener información sobre cualquier archivo abierto.
1. Introducción a lsof
Simplemente escribiendo lsof proporcionará una lista de todos los archivos abiertos pertenecientes a todos los procesos activos.
# lsof COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 8,1 4096 2 / init 1 root txt REG 8,1 124704 917562 /sbin/init init 1 root 0u CHR 1,3 0t0 4369 /dev/null init 1 root 1u CHR 1,3 0t0 4369 /dev/null init 1 root 2u CHR 1,3 0t0 4369 /dev/null init 1 root 3r FIFO 0,8 0t0 6323 pipe ...
De forma predeterminada, se muestra un archivo por línea. La mayoría de las columnas se explican por sí mismas. Explicaremos los detalles sobre un par de columnas crípticas (FD y TYPE).
FD:representa el descriptor del archivo. Algunos de los valores de FD son,
- cwd:directorio de trabajo actual
- txt:archivo de texto
- mem:archivo asignado a la memoria
- mmap:dispositivo de memoria asignada
- NÚMERO:representa el descriptor de archivo real. El carácter después del número, es decir, '1u', representa el modo en que se abre el archivo. r para leer, w para escribir, u para leer y escribir.
TIPO:especifica el tipo de archivo. Algunos de los valores de TYPE son,
- REG:archivo normal
- DIR – Directorio
- FIFO:primero en entrar, primero en salir
- CHR:archivo especial de caracteres
Para obtener una lista completa de FD y TIPO, consulte man lsof.
2. Lista de procesos que abrieron un archivo específico
Puede enumerar solo los procesos que abrieron un archivo específico proporcionando el nombre del archivo como argumentos.
# lsof /var/log/syslog COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 488 syslog 1w REG 8,1 1151 268940 /var/log/syslog
3. Lista de archivos abiertos en un directorio
Puede enumerar los procesos que abrieron archivos en un directorio específico usando la opción '+D'. +D también recurrirá a los subdirectorios. Si no desea que lsof recurra, utilice la opción '+d'.
# lsof +D /var/log/ COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 488 syslog 1w REG 8,1 1151 268940 /var/log/syslog rsyslogd 488 syslog 2w REG 8,1 2405 269616 /var/log/auth.log console-k 144 root 9w REG 8,1 10871 269369 /var/log/ConsoleKit/history
4. Enumere los archivos abiertos según los nombres de los procesos que comienzan con
Puede enumerar los archivos abiertos por nombres de proceso que comienzan con una cadena, usando la opción '-c'. -c seguido del nombre del proceso enumerará los archivos abiertos por el proceso que comienzan con ese nombre de proceso. Puede dar múltiples interruptores -c en una sola línea de comando.
# lsof -c ssh -c init COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root txt REG 8,1 124704 917562 /sbin/init init 1 root mem REG 8,1 1434180 1442625 /lib/i386-linux-gnu/libc-2.13.so init 1 root mem REG 8,1 30684 1442694 /lib/i386-linux-gnu/librt-2.13.so ... ssh-agent 1528 lakshmanan 1u CHR 1,3 0t0 4369 /dev/null ssh-agent 1528 lakshmanan 2u CHR 1,3 0t0 4369 /dev/null ssh-agent 1528 lakshmanan 3u unix 0xdf70e240 0t0 10464 /tmp/ssh-sUymKXxw1495/agent.1495
5. Listar procesos usando un punto de montaje
En algún momento, cuando intentamos desmontar un directorio, el sistema dirá el error "Dispositivo o recurso ocupado". Entonces, debemos averiguar cuáles son todos los procesos que usan el punto de montaje y eliminar esos procesos para desmontar el directorio. Usando lsof podemos encontrar esos procesos.
# lsof /home
Lo siguiente también funcionará.
# lsof +D /home/
6. Lista de archivos abiertos por un usuario específico
Para encontrar la lista de archivos abiertos por un usuario específico, use la opción '-u'.
# lsof -u lakshmanan COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME update-no 1892 lakshmanan 20r FIFO 0,8 0t0 14536 pipe update-no 1892 lakshmanan 21w FIFO 0,8 0t0 14536 pipe bash 1995 lakshmanan cwd DIR 8,1 4096 393218 /home/lakshmanan
A veces, es posible que desee enumerar los archivos abiertos por todos los usuarios, espere algunos 1 o 2. En ese caso, puede usar '^' para excluir solo a un usuario en particular de la siguiente manera
# lsof -u ^lakshmanan COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rtkit-dae 1380 rtkit 7u 0000 0,9 0 4360 anon_inode udisks-da 1584 root cwd DIR 8,1 4096 2 /
El comando anterior enumeró todos los archivos abiertos por todos los usuarios, espere el usuario 'lakshmanan'.
7. Listar todos los archivos abiertos por un proceso específico
Puede enumerar todos los archivos abiertos por un proceso específico usando la opción '-p'. A veces será útil obtener más información sobre un proceso específico.
# lsof -p 1753 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 1753 lakshmanan cwd DIR 8,1 4096 393571 /home/lakshmanan/test.txt bash 1753 lakshmanan rtd DIR 8,1 4096 2 / bash 1753 lakshmanan 255u CHR 136,0 0t0 3 /dev/pts/0 ...
8. Elimina todos los procesos que pertenecen a un usuario en particular
Cuando desee eliminar todos los procesos que tienen archivos abiertos por un usuario específico, puede usar la opción '-t' para mostrar la salida solo con la identificación del proceso y pasarla a eliminar de la siguiente manera
# kill -9 `lsof -t -u lakshmanan`
El comando anterior eliminará todos los procesos pertenecientes al usuario 'lakshmanan', que tiene archivos abiertos.
Del mismo modo, también puede usar '-t' de muchas maneras. Por ejemplo, para enumerar el ID de proceso de un proceso que abrió /var/log/syslog puede hacerlo
# lsof -t /var/log/syslog 489
Hablando de matar, ¿sabías que hay 4 formas de matar un proceso?
9. Combina más opciones de lista usando OR/AND
De manera predeterminada, cuando usa más de una opción de lista en lsof, aparecerán en OR. Por ejemplo,
# lsof -u lakshmanan -c init COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 8,1 4096 2 / init 1 root txt REG 8,1 124704 917562 /sbin/init bash 1995 lakshmanan 2u CHR 136,2 0t0 5 /dev/pts/2 bash 1995 lakshmanan 255u CHR 136,2 0t0 5 /dev/pts/2 ...
El comando anterior utiliza dos opciones de lista, '-u' y '-c'. Entonces, el comando enumerará el proceso que pertenece al usuario 'lakshmanan' y el nombre del proceso comienza con 'init'.
Pero cuando desea enumerar un proceso que pertenece al usuario 'lakshmanan' y el nombre del proceso comienza con 'init', puede usar la opción '-a'.
# lsof -u lakshmanan -c init -a
El comando anterior no generará nada, porque no existe un proceso llamado 'init' que pertenezca al usuario 'lakshmanan'.
10. Ejecuta lsof en modo de repetición
lsof también es compatible con el modo de repetición. Primero enumerará los archivos en función de los parámetros dados, y los retrasará durante segundos específicos y volverá a enumerar los archivos en función de los parámetros dados. Puede ser interrumpido por una señal.
El modo de repetición se puede habilitar usando '-r' o '+r'. Si se usa '+r', el modo de repetición finalizará cuando no se encuentren archivos abiertos. '-r' continuará enumerando, retrasando, enumerando hasta que se produzca una interrupción, independientemente de si los archivos están abiertos o no.
Cada salida de ciclo se separará usando ‘=======’. También especifica el retraso de tiempo como '-r' | '+r'.
# lsof -u lakshmanan -c init -a -r5 ======= ======= COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME inita.sh 2971 lakshmanan cwd DIR 8,1 4096 393218 /home/lakshmanan inita.sh 2971 lakshmanan rtd DIR 8,1 4096 2 / inita.sh 2971 lakshmanan txt REG 8,1 83848 524315 /bin/dash inita.sh 2971 lakshmanan mem REG 8,1 1434180 1442625 /lib/i386-linux-gnu/libc-2.13.so inita.sh 2971 lakshmanan mem REG 8,1 117960 1442612 /lib/i386-linux-gnu/ld-2.13.so inita.sh 2971 lakshmanan 0u CHR 136,4 0t0 7 /dev/pts/4 inita.sh 2971 lakshmanan 1u CHR 136,4 0t0 7 /dev/pts/4 inita.sh 2971 lakshmanan 2u CHR 136,4 0t0 7 /dev/pts/4 inita.sh 2971 lakshmanan 10r REG 8,1 20 393578 /home/lakshmanan/inita.sh =======
En la salida anterior, durante los primeros 5 segundos, no hay salida. Después de eso, se inicia un script llamado "inita.sh" y enumera la salida.
Encontrar conexión de red
Las conexiones de red también son archivos. Entonces podemos encontrar información sobre ellos usando lsof.
11. Listar todas las conexiones de red
Puede enumerar todas las conexiones de red abiertas usando la opción '-i'.
# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME avahi-dae 515 avahi 13u IPv4 6848 0t0 UDP *:mdns avahi-dae 515 avahi 16u IPv6 6851 0t0 UDP *:52060 cupsd 1075 root 5u IPv6 22512 0t0 TCP ip6-localhost:ipp (LISTEN)
También puede usar '-i4' o '-i6' para listar solo 'IPV4' o 'IPV6' respectivamente.
12. Listar todos los archivos de red en uso por un proceso específico
Puede enumerar todos los archivos de red que utiliza un proceso de la siguiente manera
# lsof -i -a -p 234
También puede usar lo siguiente
# lsof -i -a -c ssh
El comando anterior enumerará los archivos de red abiertos por los procesos que comienzan con ssh.
13. Lista de procesos que están escuchando en un puerto en particular
Puede enumerar los procesos que están escuchando en un puerto en particular usando '-i' con ':' de la siguiente manera
# lsof -i :25 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME exim4 2541 Debian-exim 3u IPv4 8677 TCP localhost:smtp (LISTEN)
14. Listar todas las conexiones TCP o UDP
Puede listar todas las conexiones TCP o UDP especificando el protocolo usando '-i'.
# lsof -i tcp; lsof -i udp;
15. Listar todos los archivos del sistema de archivos de red (NFS)
Puede enumerar todos los archivos NFS usando la opción '-N'. El siguiente comando lsof enumerará todos los archivos NFS utilizados por el usuario 'lakshmanan'.
# lsof -N -u lakshmanan -a