A veces necesitamos saber cuales son todos los archivos abiertos por un proceso en un sistema operativo de la familia Unix (GNU/Linux, *BSD, Solaris, etcétera). Por ejemplo, deseamos saber en qué archivo está registrando su log un demonio. Para ello es posible recurrir a la herramienta lsof.

La herramienta lsof simplemente lista archivos abiertos. Cabe recordar que un archivo puede ser un archivo común y corriente, un directorio, un dispositivo de acceso por bloques, un dispositivo de caracteres, un pipe, una referencia a un ejecutable, una librería, un stream, o incluso un socket. Cuando se ejecuta sin parámetros, lsof lista todos los archivos abiertos por todos los procesos activos en el sistema, lo cual suele ser una salida extremadamente extensa.

Sin embargo, lsof incluye una gran cantidad de opciones para filtrar la salid. Por ejemplo, a través de la opción -p es posible listar sólo los archivos abiertos por un determinado PID (process ID):

lsof -p PID

Veamos un ejemplo. Necesito saber cuáles son todos los archivos abiertos por el demonio slapd, pero no conozco su PID. Sin embargo es posible obtenerlo de la salida del comando ps:

root@debian8:~# lsof -p $(ps ax | grep "[s]lapd" | cut -d" " -f1)
COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF   NODE NAME
slapd   16930 ldap  cwd    DIR              254,0     4096      2 /
slapd   16930 ldap  rtd    DIR              254,0     4096      2 /
slapd   16930 ldap  txt    REG              254,0  1845968 155700 /usr/local/libexec/slapd
slapd   16930 ldap  mem    REG              254,0  1607632 143061 /usr/lib/locale/locale-archive
slapd   16930 ldap  mem    REG              254,0   396136 148901 /usr/local/lib/libodbcinst.so.2.0.0
slapd   16930 ldap  mem    REG              254,0   328728 152773 /usr/local/pgsql/lib/libpq.so.5.10
slapd   16930 ldap  mem    REG              254,0  1544552 153350 /usr/local/lib/psqlodbcw.so
slapd   16930 ldap  mem    REG              254,0    43592 393106 /lib/x86_64-linux-gnu/libnss_nis-2.19.so
slapd   16930 ldap  mem    REG              254,0    89104 393068 /lib/x86_64-linux-gnu/libnsl-2.19.so
slapd   16930 ldap  mem    REG              254,0    31632 393070 /lib/x86_64-linux-gnu/libnss_compat-2.19.so
slapd   16930 ldap  mem    REG              254,0    47712 393097 /lib/x86_64-linux-gnu/libnss_files-2.19.so
slapd   16930 ldap  mem    REG              254,0  1738176 392938 /lib/x86_64-linux-gnu/libc-2.19.so
slapd   16930 ldap  mem    REG              254,0   137384 392700 /lib/x86_64-linux-gnu/libpthread-2.19.so
slapd   16930 ldap  mem    REG              254,0    84856 393153 /lib/x86_64-linux-gnu/libresolv-2.19.so
slapd   16930 ldap  mem    REG              254,0    35176 392977 /lib/x86_64-linux-gnu/libcrypt-2.19.so
slapd   16930 ldap  mem    REG              254,0  2066816 133147 /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0
slapd   16930 ldap  mem    REG              254,0   395176 133148 /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0
slapd   16930 ldap  mem    REG              254,0  1753808 148905 /usr/local/lib/libodbc.so.2.0.0
slapd   16930 ldap  mem    REG              254,0    14664 392986 /lib/x86_64-linux-gnu/libdl-2.19.so
slapd   16930 ldap  mem    REG              254,0    39392 148884 /usr/lib/x86_64-linux-gnu/libltdl.so.7.3.0
slapd   16930 ldap  mem    REG              254,0   140928 392878 /lib/x86_64-linux-gnu/ld-2.19.so
slapd   16930 ldap  mem    REG              254,0   151111 138817 /usr/share/locale/es/LC_MESSAGES/libc.mo
slapd   16930 ldap  mem    REG              254,0    26258 150023 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
slapd   16930 ldap    0u   CHR                1,3      0t0   1028 /dev/null
slapd   16930 ldap    1u   CHR                1,3      0t0   1028 /dev/null
slapd   16930 ldap    2u   CHR                1,3      0t0   1028 /dev/null
slapd   16930 ldap    3u  unix 0xffff880036a55040      0t0  80115 socket
slapd   16930 ldap    4r  FIFO                0,8      0t0  80116 pipe
slapd   16930 ldap    5w  FIFO                0,8      0t0  80116 pipe
slapd   16930 ldap    6u  0000                0,9        0   7631 anon_inode
slapd   16930 ldap    7u  IPv4              80117      0t0    TCP *:ldap (LISTEN)
slapd   16930 ldap    8u  IPv4              80118      0t0    TCP *:ldaps (LISTEN)
slapd   16930 ldap    9w   REG              254,2  3018217     23 /tmp/mylog_ldap16930.log
slapd   16930 ldap   11w   REG              254,2   132993     24 /tmp/psqlodbc_ldap16930.log
slapd   16930 ldap   12u  IPv4              81109      0t0    TCP localhost:50099->localhost:postgresql (ESTABLISHED)

Con una simple manipulación de la salida de ps es posible recuperar sólo el PID del demonio slapd en ejecución y pasárselo a lsof. Notar cómo he filtrado la salida de ps para ocultar al proceso en ejecución de grep.

¡Espero que les resulte útil!


Tal vez pueda interesarte


Compartí este artículo