La herramienta de comando «lsof» en Linux es una de las muchas herramientas incorporadas que es súper útil para comprobar la «lista de archivos abiertos». Sí, el término «lsof» es la abreviatura de la tarea.
Hay un número de procesos que se ejecutan en el sistema todo el tiempo, accediendo a diferentes archivos del sistema. Estos archivos pueden ser archivos de disco, scripts, sockets de red, dispositivos, tuberías con nombre y otros. Usando «lsof», es posible realizar muchas cosas, como la depuración. También es bastante útil para que los administradores del sistema sepan a qué archivos están accediendo los procesos. Uno de los escenarios más útiles que he encontrado es cuando estás a punto de desmontar un sistema de archivos, pero todavía se está accediendo a él.
¡Sin más preámbulos, vamos a empezar con «lsof»! Estoy asumiendo que su actual sistema UNIX/Linux ya tiene «lsof» instalado.
Esto reporta la ruta completa del comando, en este caso, «lsof».
lsof -v
Esto reportará información detallada de la versión de «lsof», incluyendo la fecha de construcción del binario, la versión del compilador, las banderas del compilador y otros.
Uso básico de «lsof»
Ejecuta «lsof» por sí mismo.
Informa de una GRAN lista de todos los ficheros a los que está accediendo el sistema en el momento de ejecutar el comando.
Si bien todos los campos se explican por sí mismos, la mayoría se confunde con las columnas «FD» y «TYPE» y sus valores. Vamos a comprobarlos.
FD: Abreviatura de «File Descriptor». Sale con los siguientes valores.
- cwd: Directorio de trabajo actual
- rtd: Directorio raíz
- txt: Texto del programa (datos, código y otros)
- mem: Archivo mapeado en memoria
- err: FD information error
- mmap: Dispositivo mapeado en memoria
- ltx: Texto de biblioteca compartida (datos y código)
- m86: DOS Merge mapped file
También hay otros valores que notarás en la columna, como «1u» seguido del valor u, r, w, etc. ¿Qué significan?
- r: Acceso de lectura
- w: Acceso de escritura
- u: Acceso de lectura y escritura
- – : Modo desconocido y contiene un carácter de bloqueo
- ‘: El modo es desconocido y no hay ningún carácter de bloqueo
TYPE: Describe el tipo de archivo y su identificación. Los valores son los siguientes.
- DIR: Directorio
- CHR: Archivo de caracteres especiales
- REG: Archivo regular
- FIFO: First in, first out
Archivos abiertos específicos del usuario
Linux es una brillante plataforma multiusuario. Varios usuarios pueden acceder al sistema al mismo tiempo y realizar las operaciones para las que tienen permiso.
Para comprobar los archivos a los que está accediendo un determinado usuario, ejecuta el siguiente comando.
Sin embargo, para comprobar los usuarios con mayor rango, «lsof» necesitará el privilegio de «superusuario».
¿Qué tal si comprueba todos los comandos y archivos a los que accede un determinado usuario? Ejecuta el siguiente.
De nuevo, para los usuarios con mayor rango, «lsof» necesitará el privilegio de «superusuario».
Procesos en ejecución específicos de un puerto
Para averiguar todos los procesos que están utilizando actualmente un determinado puerto, llame a «lsof» con la bandera «-i» seguida de la información de protocolo y puerto.
:<servicio|puerto>
Por ejemplo, para comprobar todos los programas que actualmente acceden al puerto 80 sobre el protocolo TCP/IP, ejecute el siguiente comando.
Este método también puede utilizarse para mostrar todos los procesos que están utilizando puertos dentro de un determinado rango, por ejemplo, del 1 al 1000. La estructura del comando es similar a la anterior con un poco de magia en la parte del número de puerto.
Procesos específicos de protocolo
Aquí hay 2 ejemplos que muestran los procesos que están usando actualmente los protocolos IPv4 e IPv6.
Listado de conexiones de red
El siguiente comando reportará todas las conexiones de red del sistema actual.
Excluir con ^
Sí, podemos excluir usuarios específicos, puertos, FD y otros utilizando el carácter «^». Lo único que hay que hacer es utilizarlo con precaución para no estropear toda la salida.
En este ejemplo, vamos a excluir todos los procesos del usuario «root».
Hay otras formas de utilizar este mecanismo de exclusión con «lsof», por ejemplo, con las banderas como «-c», «-d», etc. No todas las banderas soportan este mecanismo. Por eso recomiendo probar una demo con este método con cualquier bandera antes de implementarlo en algunos scripts.
Búsqueda de PID
El PID es una propiedad importante de cualquier proceso en ejecución en el sistema. Permite una localización más fina de un determinado proceso. El nombre del proceso no es muy útil en muchas situaciones ya que el mismo binario puede crear copias de sí mismo y realizar diferentes tareas en paralelo.
Si no sabe cómo obtener el PID de un proceso, simplemente use «ps» para listar todos los procesos en ejecución y filtre la salida usando «grep» con el nombre del proceso y/o comandos.
Ahora, realice el filtrado usando «grep».
Ahora, comprueba a qué ficheros está accediendo ese PID.
Listando los archivos abiertos para un dispositivo específico
La funcionalidad de «lsof» no se limita a estas funciones. También puede filtrar el resultado de «lsof» por base de dispositivos. Para este propósito, el comando se verá algo así.
Este comando es súper útil para encontrar todos los procesos en ejecución con su información de propietario que acceden a un sistema de archivos en particular. Si tienes problemas para desmontar un sistema de archivos, esta es la mejor manera de hacerlo.
Lista de archivos abiertos bajo un directorio
Similar al ejemplo anterior, sólo hay que pasar la ruta del directorio a «lsof» para averiguar si algún proceso está accediendo a él.
Nota: «lsof» comprobará el directorio de forma recursiva, por lo que puede tardar.
Bonus: termina toda la actividad del usuario
Tenga mucho cuidado con esta parte, ya que puede simplemente estropear todo lo que un usuario está haciendo. El siguiente comando matará todos los procesos en ejecución de un usuario.
Pensamientos finales
Las características de «lsof» no se quedan aquí. Las mencionadas aquí son las que más vamos a necesitar en el día a día. Hay muchas otras funcionalidades de «lsof» que pueden ser útiles (en casos concretos, claro).
Para conocer todas las funcionalidades disponibles y su uso, consulta las páginas man e info de «lsof».
¡Disfruta!