¿Alguna vez se ha preguntado cómo saber qué archivos están abiertos y en uso en su sistema? El comando lsof de Linux enumera los archivos abiertos y proporciona mucha información adicional. Descubra cómo utilizar lsof con estos ejemplos prácticos.
Qué es esto lsof?
CONTENIDOS DE LA PAGINA
Disponible de forma nativa en cualquier sistema operativo Linux, el lsof
El comando proporciona una lista de archivos abiertos. Sin embargo, el resultado puede ser un poco críptico y largo, especialmente cuando se utilizan muchas aplicaciones en un sistema determinado. Echemos un vistazo a los conceptos básicos. lsof
producción. Correremos lsof
como raíz.
Para iniciar sesión como root, puede abrir una ventana de terminal y escribir un comando como sudo su
o su
para recibir una solicitud de autenticación de root. Alternativamente, puede ejecutar sudo lsof
. Tenga en cuenta que si bien puede correr lsof
incluso como un usuario no root normal, puede encontrar que la salida está incompleta.
Ejemplo: Base lsof Producción
sudo su lsof | head -n10
Aquí comenzamos el lsof herramienta usando el lsof
comando y capturó las primeras diez líneas de la salida usando una tubería (|
) para enviar la información producida por lsof
a uno secundario head -n10
comando que captura solo las primeras diez líneas (encabezado).
El lsof
El comando enumera varias columnas. Primero veamos el MANDO columna que enumera el archivo binario que contiene el archivo abierto / bloque de archivo abierto. A continuación, vemos la columna ID de proceso. PID que es extremadamente útil cuando se trata de depurar varios problemas de aplicaciones, incluidos los bloqueos de archivos retenidos incorrectamente. En la siguiente sección veremos un ejemplo de cómo podemos usar lsof
en combinación con kill
para terminar (destructivamente) aplicaciones que contienen bloques de archivos defectuosos.
Si es compatible con su sistema operativo, el TID puede ayudarlo a comprender si una fila en particular es un proceso o una actividad. Si la salida está vacía, como se puede ver en nuestro ejemplo (que se ejecuta en Linux Mint, un sistema operativo que admite el TID salida de columna), la línea / comando dado es un proceso, no una tarea. Por ejemplo, si inicia una aplicación de calculadora en su sistema operativo, como una tarea, esta columna se completará con un número de identificación de tarea / hilo.
El TASKCMD La columna contiene el nombre del comando de tarea. Nuevamente, solo es visible si la fila indicada es una actividad y no un proceso. Esto es normalmente el mismo que el comando / proceso que se muestra en el primero. MANDO columna, sin embargo, por ejemplo, Linux permite que una tarea cambie el nombre del comando, por lo que puede contener información adicional sobre la tarea. El USUARIO La columna enumera el usuario que inició el proceso / actividad.
Entonces tenemos una columna importante FD (Descriptor de archivo) que puede enumerar i Número de descriptor de archivo o una cadena de texto específica que indique qué tipo de descriptor de archivo es. Por ejemplo, si ves cwd
en esta columna, significa directorio de trabajo actual e indica que el proceso o la tarea especificada tiene un candado abierto en el directorio de trabajo actual y que el directorio de trabajo aparece en la lista PRIMER NOMBRE columna.
Para obtener una lista completa de todos los posibles FD
cuerdas, como man lsof
en el símbolo del sistema seguido de escribir / FD
(con 3 espacios después de la barra y antes de FD) una vez en el manual, luego presionando INICIAR SESIÓN EN para buscar la sección FD.
Cuando se trata de archivos normales, puede pensar en FD columna como un contador o un contador de ID único, comenzando en 0 y ascendiendo hasta el número total de archivos abiertos regulares en el sistema, con el número máximo de archivos abiertos definido por el ulimit -n ajuste, etc.
Al mirar archivos normales, el FD la columna mostrará por ejemplo 102u
o 13w
. Estos dos ejemplos representan respectivamente el archivo 102o abierto en el sistema, en modo de acceso mixto de lectura / escritura, como lo indica el u
indicador / etiqueta Y el decimotercer archivo abierto en el sistema, solo en modo de acceso de escritura.
El GÉNERO la columna se explica por sí misma; indica si se mantiene un bloque de apertura de directorio o archivo normal. Hay varias otras etiquetas que pueden aparecer aquí y una búsqueda de / TYPE
en man lsof
(como se explicó anteriormente) proporcionará una lista completa.
El DISPOSITIVO La columna suele enumerar los números de dispositivo, separados por comas, para la mayoría de los tipos de archivos. El SIZE/OFF
columna es el tamaño del archivo, o el desplazamiento del archivo en bytes, y el NODO La columna normalmente muestra el nodo de archivo o el número de inodo de archivo NFS de archivos locales. También puede enumerar, por ejemplo TCP o UDP cuando el candado dado es una conexión a Internet abierta.
Ejemplo: use lsof con asesinato
Utilizando lsof
en combinación con grep
, awk
Y kill
puede buscar un archivo específico en un sistema dado y luego terminar el proceso (usando el PIDo Identificador de proceso, descrito anteriormente).
Tenga en cuenta que esto solo debe hacerse en situaciones en las que tenga sentido hacerlo. Por ejemplo, puede tener un script Bash de subprocesos múltiples que inicie muchas subcapas diferentes donde cada una contiene un archivo determinado y espera que uno de los subprocesos se suspenda. Conoce el nombre del archivo abierto del proceso de suspensión, pero no sabe cuál es el PID para ese proceso / actividad lo es.
En tal situación, podemos ejecutar los siguientes comandos:
sudo su lsof | grep 'some_file_descriptor' | awk '{print $2}' | xargs -I{} kill -9 {}
Pongamos esto en un ejemplo práctico. Supongamos que hemos creado el siguiente script test.sh
en /tmp
:
rm -Rf workspace mkdir workspace cd workspace sleep 36000
Este script, cuando se ejecuta, creará un directorio llamado workspace
, cambie los directorios dentro de él con cd
y luego sleep
durante 10 horas. Si bien no parece abrir ningún archivo a primera vista, recuerde que cwd
Discutido antes; el script tiene un directorio de trabajo actual en uso, a saber /tmp/workspace
!
Veamos cómo funciona prácticamente. Primero, definamos (usando su editor de texto favorito como vi
), luego inicie el script en una sesión de terminal:
Luego cambiamos a una sesión de terminal secundaria / nueva y ejecutamos lsof
, buscando el directorio de trabajo del script, es decir workspace
:
Como podemos ver, lsof
es capaz de encontrar no solo nuestro script de prueba test.sh
quien se aferra a cwd
encerrar /tmp/workspace
, pero también vemos que sleep
, comenzó desde dentro del guión, contiene un cwd
abre el descriptor de archivo (o más bien directorio) en el mismo directorio.
También podemos ver ambos PID Para el test.sh
guión así como para el sleep
mando. Asumamos por un segundo que lo nuestro test.sh
el guión se suspendió y queríamos terminarlo de forma completamente destructiva, por ejemplo, con kill -9
que es la forma más destructiva de terminar un proceso sin ningún nivel de cierre regular, y esto se basa en los archivos abiertos (o en nuestro caso, los directorios abiertos) al que se aferra el script. Damos el siguiente comando desde el terminal secundario:
lsof | grep "workspace" | awk '{print $2}' | xargs -I{} kill -9 {}
Este comando tomará la salida anterior y la analizará más a fondo. El awk '{print $2}'
Básicamente toma muestras de la columna secundaria (los ID de proceso) y el xargs
el comando pasará esta segunda columna a kill -9
(la {}
en el comando será reemplazado por cualquier entrada xargs
recibe).
Bien podríamos anticiparlo lsof
tiene una fila de encabezado que contiene PID
y este texto también se pasará a matar. Si bien no creará un problema, un comando general mejor leería lsof | grep "workspace" | grep -v "PID" | awk '{print $2}' | xargs -I{} kill -9 {}
o alguna otra forma de filtrar la primera fila por completo.
El resultado en nuestra primera sesión terminal / primaria es que nuestro script se mata instantáneamente:
Si quieres saber más sobre xargs, puede leer sobre el uso de xargs en combinación con bash -c para crear comandos complejos. Para la programación Bash multiproceso, consulte Cómo utilizar el procesamiento multiproceso en scripts Bash.
Terminando
En este artículo hemos explorado el uso de lsof
, el comando list open files y qué información representa cada una de las columnas en su salida predeterminada. También analizamos un caso de uso práctico en el que usamos lsof
en combinación con grep
, awk
Y kill
para encontrar un archivo en particular (o en nuestro caso un directorio) mantenido abierto por un script y luego terminar ese script cerrando así el directorio abierto.
Si disfrutó leyendo este artículo, consulte nuestras afirmaciones, errores y fallas: ¿cuál es la diferencia? Articulo.