Cómo enumerar archivos abiertos para un proceso en Linux

Guía para usar el comando "lsof" para un proceso

Si eres un usuario frecuente de sistemas Linux o Unix seguramente habrás escuchado la frase, “En Linux, todo es un archivo”. Esto puede clasificarse como la simplificación excesiva del concepto, pero resulta muy útil para comprender cómo funcionan los archivos en el sistema Linux.

No todo lo que aparece en el entorno Linux tiene que ser un archivo. A veces puede ser un proceso, puede ser un archivo especial que representa la información del hardware, los directorios y otras cosas.

Este tutorial lo guiará para encontrar todos los archivos que están abiertos para un proceso en particular en Linux.

Introducción a lsof Mando

La belleza del sistema Linux es que puede controlar y administrar todo su sistema a través de la terminal, siempre que conozca bien los comandos. Una vez que se conocen los comandos, todas las tareas en la terminal se convierten en un juego de niños.

lsof representa 'Lista de archivos abiertos". Una vez que conozca la versión larga del comando, le resultará muy fácil comprender y utilizar el comando de manera productiva.

El lsof El comando muestra las listas de archivos abiertos, sockets y tuberías. Puede buscar fácilmente los archivos abiertos con este comando. Cuando el lsof El comando se usa sin ninguna opción, muestra todos los archivos abiertos con respecto a los procesos activos que se están ejecutando.

Nota: Asegúrate de usar sudo mientras ejecuta los comandos.

Utilizando el lsof Mando

Estudiaremos la salida de la lsof comando en detalle. Estudie el siguiente comando.

sudo lsof | menos

Nota: Si ejecutamos directamente el lsof comando, la salida será muy grande y podría crear confusión para continuar. Por lo tanto, aquí he usado lsof | menos comando para la conveniencia del tutorial.

Producción:

gaurav @ ubuntu: ~ $ sudo lsof | menos COMANDO PID TID USUARIO TIPO FD TAMAÑO DEL DISPOSITIVO / APAGADO NOMBRE NOMBRE kdevtmpfs 31 root cwd DIR 0,6 4400 2 / kdevtmpfs 31 root rtd DIR 0,6 4400 2 / kdevtmpfs 31 root txt unknown / proc / 31 / exe netns 32 root cwd DIR 8,8 4096 2 / netns 32 root rtd DIR 8,8 4096 2 / netns 32 root txt desconocido / proc / 32 / exe rcu_tasks 33 root cwd DIR 8,8 4096 2 / rcu_tasks 33 root rtd DIR 8,8 4096 2 / rcu_tasks 33 root txt desconocido / proc / 33 / exe kauditd 34 root cwd DIR 8,8 4096 2 / kauditd 34 root rtd DIR 8,8 4096 2 / kauditd 34 root txt desconocido / proc / 34 / exe 

A continuación se muestran los atributos que se muestran utilizando el lsof mando.

ParámetroDescripción
MandoMuestra el nombre del comando que abre el archivo.
PIDNúmero de identificación de proceso del proceso que abre el archivo.
TIDNúmero de identificador de hilo. Puede ser un hilo o un número de tarea.
UsuarioID de usuario o nombre del usuario propietario del proceso.
FDMuestra el descriptor de archivo del archivo.
EscribeTipo de nodo asociado al archivo.
DispositivoMuestra los números de los dispositivos.
Tamaño / ApagadoMuestra el tamaño del archivo en bytes.
NodoMuestra el número de inodo del directorio o del directorio padre.
NombreMuestra el nombre del sistema de archivos donde se encuentra el proceso.

Listado de los procesos

En primer lugar, es importante que obtenga los procesos que se están ejecutando y sus respectivos ID de proceso. Linux proporciona una variedad de comandos para enumerar los procesos junto con sus atributos como PID, usuario, directorio, etc.

Puedes usar los comandos como cima, PD, htop, pstree para enumerar los procesos en la terminal.

A lo largo del tutorial, usaré el cima comando para hacerlo. El cima El comando proporciona una vista dinámica en tiempo real de un sistema en ejecución. También muestra todos los procesos y subprocesos que actualmente administra el kernel de Linux. Estudie el bloque que se muestra a continuación para comprobar la salida del cima mando.

Sintaxis:

sudo superior

Producción:

gaurav @ ubuntu: ~ $ sudo top PID USER PR NI VIRT RES SHR S% CPU% MEM TIME + COMMAND 2703 gaurav 20 0 4286124 1.142g 103584 R 88.2 30.5 87: 48.08 Contenido web 1173 mongodb 20 0 288536 6776 3428 S 5.9 0.2 2: 34.41 mongod 13765 gaurav 20 0 2931568 131408 47496 S 5.9 3.3 1: 42.34 Web Content 1 root 20 0 225904 6824 4900 S 0.0 0.2 0: 27.25 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0: 00.05 kthreadd 4 root 0-20 0 0 0 I 0.0 0.0 0: 00.00 kworker / 0: 0H 6 raíz 0-20 0 0 0 I 0.0 0.0 0: 00.00 mm_percpu_wq 7 raíz 20 0 0 0 0 S 0.0 0.0 0: 01.89 ksoftirqd / 0 8 raíz 20 0 0 0 0 I 0.0 0.0 0: 22.32 rcu_sched 9 root 20 0 0 0 0 I 0.0 0.0 0: 00.00 rcu_bh 10 root rt 0 0 0 0 S 0.0 0.0 0: 03.13 migración / 0 

En el bloque anterior, podemos ver toda la información relacionada con el proceso en un solo lugar. Desde aquí podemos encontrar el PID del proceso del cual tenemos que mostrar los archivos abiertos usando el lsof mando.

Pero si desea averiguar el ID de proceso de solo un proceso en particular y evitar otros procesos no deseados, use el siguiente comando.

Sintaxis:

sudo superior | grep [Process_Name]

Ejemplo:

gaurav @ ubuntu: ~ $ top | grep terminal 13819 gaurav 20 0 803336 19728 9160 S 0.3 0.5 0: 53.63 gnome-terminal- 13819 gaurav 20 0 803336 19728 9160 S 1.0 0.5 0: 53.66 gnome-terminal- 13819 gaurav 20 0 803336 19728 9160 S 0.3 0.5 0: 53.67 gnome -terminal- gaurav @ ubuntu: ~ $

Aquí hemos mostrado específicamente el ID de proceso del proceso que tiene la cadena "terminal" en el nombre del proceso. Este método resulta útil cuando no conoce el nombre completo del proceso o el PID.

Visualización de archivos abiertos relacionados con un proceso que utiliza el PID

En el bloque anterior, aprendimos cómo obtener la información relacionada con el proceso con la ayuda del comando superior. Ahora usaremos el PID correspondiente a cualquier proceso en el sistema e intente mostrar la lista de los archivos abiertos relacionados con ese proceso utilizando el lsof mando.

De la salida dada anteriormente, tomemos el proceso correspondiente al PID 1173 que está resaltado. Estaremos usando el lsof -p [PID] comando para hacerlo.

Sintaxis:

sudo lsof -p [PID]

Este comando toma el PID del proceso como entrada y lista todos los archivos correspondientes a este PID.

Producción:

gaurav @ ubuntu: ~ $ sudo lsof -p 1173 lsof: ADVERTENCIA: no se puede stat () fuse.gvfsd-fuse sistema de archivos / run / user / 1000 / gvfs La información de salida puede estar incompleta. COMANDO PID USUARIO FD TIPO TAMAÑO DEL DISPOSITIVO / APAGADO NOMBRE NOMBRE mongod 1173 mongodb cwd DIR 8,8 4096 2 / mongod 1173 mongodb rtd DIR 8,8 4096 2 / mongod 1173 mongodb txt REG 8,8 38379496 2885608 / usr / bin / mongod mongod 1173 mongodb mem REG 8,8 71776 2624380 /lib/x86_64-linux-gnu/libnss_myhostname.so.2 mongod 1173 mongodb mem REG 8,8 101168 2624643 /lib/x86_64-linux-gnu/libresolv-2.27.so mongod 1173 mongodb mem REG 8,8 26936 2624439 /lib/x86_64-linux-gnu/libnss_dns-2.27.so mongod 1173 mongodb mem REG 8,8 10160 2626002 /lib/x86_64-linux-gnu/libnss_mdns4_minimal.so.2 mongod 1173 mongodb mem REG 8,8 47568 2624441 /lib/x86_64-linux-gnu/libnss_files-2.27.so mongod 1173 mongodb mem REG 8,8 3004224 2909671 / usr / lib / locale / locale-archive mongod 1173 mongodb mem REG 8,8 2030544 2621501 / lib / x86_64-linux-gnu / libc-2.27.so mongod 1173 mongodb mem REG 8,8 144976 2624627 /lib/x86_64-linux-gnu/libpthread-2.27.so mongod 1173 mongodb mem REG 8,8 96616 2624649 / lib / x86_64-linux-gnu / libgcc_s.so.1 mongod 1173 mongodb yo m REG 8,8 1700792 2622735 /lib/x86_64-linux-gnu/libm-2.27.so mongod 1173 mongodb mem REG 8,8 14560 2621535 /lib/x86_64-linux-gnu/libdl-2.27.so mongod 1173 mongodb mem REG 8,8 31680 2624646 /lib/x86_64-linux-gnu/librt-2.27.so mongod 1173 mongodb mem REG 8,8 2357760 2890079 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 gaurav @ ubuntu : ~ $

Los archivos que están abiertos para el proceso con el ID de proceso 1713 se muestran usando el lsof mando.

Nota: Los usuarios de GNOME pueden encontrar la siguiente advertencia. Puede ignorarlo con seguridad.

lsof: ADVERTENCIA: no se puede stat () fuse.gvfsd-fusionar el sistema de archivos / run / user / 1000 / gvfs La información de salida puede estar incompleta.

Listado de archivos abiertos relacionados con un proceso utilizando el nombre del proceso

El lsof El comando también le proporciona una opción para listar los archivos abiertos usando los nombres de los procesos. Los nombres deben proporcionarse al comando como una cadena de entrada. Consulte la sintaxis a continuación para utilizar esta opción.

Sintaxis:

sudo lsof -c [nombre de proceso]

Ejemplo:

sudo lsof -c mysql

Producción:

gaurav @ ubuntu: ~ $ sudo lsof -c mysql lsof: ADVERTENCIA: no se puede stat () fuse.gvfsd-fuse sistema de archivos / run / user / 1000 / gvfs La información de salida puede estar incompleta. COMANDO PID USUARIO TIPO FD TAMAÑO DEL DISPOSITIVO / APAGADO NOMBRE NOMBRE mysqld 1266 mysql cwd DIR 8,8 4096 3154135 / var / lib / mysql mysqld 1266 mysql rtd DIR 8,8 4096 2 / mysqld 1266 mysql txt REG 8,8 24691368 2889411 / usr / sbin / mysqld mysqld 1266 mysql mem REG 8,8 6288 5505444 /usr/lib/mysql/plugin/auth_socket.so mysqld 1266 mysql DEL REG 0,18 28127 / [aio] mysqld 1266 mysql DEL REG 0,18 28126 / [ aio] mysqld 1266 mysql DEL REG 0,18 28125 / [aio] mysqld 1266 mysql mem REG 8,8 47568 2624441 /lib/x86_64-linux-gnu/libnss_files-2.27.so mysqld 1266 mysql mem REG 8,8 47576 2624592 / lib / x86_64-linux-gnu / libnss_nis-2.27.so mysqld 1266 mysql mem REG 8,8 39744 2624438 /lib/x86_64-linux-gnu/libnss_compat-2.27.so 

La salida será como aquella en la que se usa el ID del proceso en lugar del nombre del proceso.

Listado de archivos abiertos por conexiones de red

En Linux, los archivos también pueden estar en forma de información sobre sus conexiones de red, conexiones de hardware, etc. Podemos usar lsof comando para enumerar los archivos abiertos por la conexión de red. Utilice el siguiente método.

sudo lsof -i

Producción:

gaurav @ ubuntu: ~ $ sudo lsof -i COMMAND PID USER FD TYPE DEVICE SIZE / OFF NODE NAME systemd-r 969 systemd-resolve 12u IPv4 17357 0t0 UDP localhost: dominio systemd-r 969 systemd-resolve 13u IPv4 17358 0t0 TCP localhost: dominio (ESCUCHAR) systemd-r 969 systemd-resolve 15u IPv4 1685575 0t0 UDP ubuntu: 48090 -> _ puerta de enlace: dominio avahi-dae 1028 avahi 12u IPv4 23810 0t0 UDP *: mdns avahi-dae 1028 avahi 13u IPv6 23811 0t0 UDP *: mdns avahi-dae 1028 avahi 14u IPv4 23812 0t0 UDP *: 58999 avahi-dae 1028 avahi 15u IPv6 23813 0t0 UDP *: 37512 mongod 1173 mongodb 6u IPv4 28149 0t0 TCP localhost: 27017 (ESCUCHA) mysqld 1266 mysql TCP 25992 0 local 19u mysql (ESCUCHAR) apache2 1283 root 4u IPv6 28140 0t0 TCP *: http (ESCUCHAR) gaurav @ ubuntu: ~ $

Aquí podemos ver la información sobre los archivos que están abiertos por la conexión de red usando el lsof -i mando.

Conclusión

En este sencillo tutorial, hemos aprendido cómo enumerar archivos abiertos para un proceso en Linux utilizando varios métodos que son fáciles de usar. Para más usos del lsof comando, ver el lsof página de manual.