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