Cómo listar los archivos abiertos por un proceso en Linux
Hoy vamos a echar mano de la terminal para listar los archivos abiertos por un proceso en Linux. Esta es una tarea muy habitual, a la cual tendremos que enfrentarnos tarde o temprano si gestionamos servidores Linux, así que mejor estar prevenidos.
En mi caso ha surgido la necesidad de listar los archivos abiertos por un proceso porque necesitaba averiguar dónde estaba registrando su actividad un demonio. Esta actividad sabía que la registraba en un archivo, pero desconocía su localización. Así que me puse manos a la obra y fue cuando apareció el comando lsof
para solucionarme el problema.
Cómo listar los archivos abiertos por un proceso en Linux con el comando lsof.
Como ya os adelantaba, el comando que emplearemos será lsof
, el cual está disponible en todas las distribuciones Linux, *BSD, etc. Es un comando muy flexible y que nos puede sacar de más de un apuro.
El uso más básico consiste en ejecutar el comando sudo lsof
y tendremos en pantalla una lista con todos los archivos abiertos por procesos. Esta lista suele ser muy extensa, por lo que necesitaremos filtrarla para encontrar lo que estamos buscando, pero esto ya lo veremos más adelante.
Bases para entender la salida del comando lsof.
Si nos fijamos en la salida del comando lsof
, vemos que nos muestra la información organizada en diferentes columnas. De la mayoría de las columnas reconoceremos su significado de forma intuitiva (pid, user, name, etc), pero otras (FD, Type, etc) pueden resultar un tanto extrañas, por lo que explicaremos su significado de forma rápida.
La columna FD
muestra los descriptores de archivo (File Descriptor). Los posibles valores de FD son:
- cwd: hace referencia al directorio actual de trabajo (Current Working Directory).
- txt: hace referencia a un archivo de texto.
- mem: referencia a un archivo de mapeado de memoria.
- mmap: se refiere a un dispositivo de memoria mapeada.
- número: en ocasiones se mostrará un número que hace referencia al descriptor de archivo. Este número irá seguido de la letras
r
(archivo abierto para sólo lectura),w
(archivo abierto para escritura) ou
(archivo abierto para lectura y escritura).
Por otro lado, la columna TYPE
puede mostrar los siguientes valores:
- REG: archivo regular.
- DIR: directorio.
- FIFO: First In First Out (primero en entrar, primero en salir).
- CHR: archivo especial de carácter.
Existen más valores que pueden adoptar las coulmnas FD y TYPE, pero en este tutorial sólo recojo las más habituales. Si necesitas obtener más información, no dudes en acudir a la página de ayuda con el comando man lsof
.
Ejemplos prácticos de uso del comando lsof.
Vamos a ver una serie de ejemplos que se usan de forma habitual durante las tareas de administración de sistemas.
Listar los archivos abiertos por un proceso concreto.
Para listar los archivos abiertos por un proceso concreto necesitaremos averiguar en primer lugar su PID. La forma más sencilla de averiguar el PID de un proceso conociendo su nombre es con el comando pidof nombre_proceso
.
A modo de ejemplo vamos a imaginarnos que queremos averiguar el PID del proceso del servidor MySQL, para lo que ejecuto el comando pidof mysqld
. Este comando nos devuelve el número del PID, que a modo de ejemplo vamos a suponer que es 1009
.
Una vez averiguado el PID, sólo tengo que ejecutar el comando lsof -p PID
, que trasladándolo a nuestro ejemplo sería sudo lsof -p 1009
.
Este comando es al que más uso le doy y me permite averiguar con rapidez las rutas de los archivos log de un servidor Apache o Nginx (es necesario ejecutar lsof con permisos de root).
Listar los archivos abiertos por un usuario específico.
Gracias a este comando también podemos listar los archivos abiertos por un usuario concreto. En este caso el comando a ejecutar sería lsof -u nombre_usuario
.
A modo de ejemplo, vamos a listar todos los archivos abiertos por el usuario www-data
, de uso habitual en servidores Apache, con el comando sudo lsof -u www-data
.
Listar los procesos que han abierto un archivo específico.
En ocasiones conoceremos la ruta del archivo abierto y necesitaremos averiguar qué proceso ha abierto dicho archivo. En este caso, el comando sería lsof /ruta/ejemplo/archivo
.
Vamos a poner un ejemplo en el que averiguaremos que proceso ha abierto el archivo /var/log/apache2/access.log
, que como podemos esperar será el proceso o procesos correspondientes a un servidor Apache. En este caso el comando sería sudo lsof /var/log/apache2/access.log
.
Listar los archivos abiertos de un directorio.
Otra opción interesante es listar todos los archivos abiertos que se encuentran bajo un mismo directorio. El comando a ejecutar sería lsof +D /ruta/ejemplo/directorio/
.
De este modo, podemos ejecutar un comando muy útil para averiguar los archivos log abiertos el sistema. Para este, sólo tenemos que ejecutar el comando sudo lsof +D /var/log/
.
Listar todos los archivos de red y de internet.
Un proceso no sólo puede abrir un archivo o carpeta, también puede abrir una conexión, un socket, un stream, etc. Con el siguiente comando podemos listar todos los archivos de red e internet abiertos: sudo lsof -i
.