# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

Linux: El comando lsof

Lsof es una potente herramienta disponible en la shell de Linux que lista los ficheros abiertos en la máquina. Partiendo de esta base, podemos conocer rápidamente que ficheros mantiene abiertos un determinado proceso (PID), también muestra información adicional como el puerto utilizado por dichos servicios/ficheros, sockets en uso, etc.

Lanzando el comando lsof sin ningún parámetro listará todos los ficheros abiertos en la máquina en ese momento, no es recomendable ya que como imaginaréis saldrán una cantidad enorme.

Personalmente, lo que más utilizo en el día a día es lo siguiente:

Listar los ficheros abiertos de un determinado PID:

lsof -p PID

Ejemplo, vamos a listar los ficheros abiertos de un PID perteneciente a apache, también veremos los sockets y puertos en los que escucha el proceso:

lsof -p 15826
COMMAND   PID   USER   FD   TYPE     DEVICE    SIZE       NODE NAME
httpd   15826 apache  cwd    DIR        8,2    4096          2 /
httpd   15826 apache  rtd    DIR        8,2    4096          2 /
httpd   15826 apache  txt    REG        8,2  312340    6764473 /usr/sbin/httpd
httpd   15826 apache  DEL    REG        8,2            6761188 /usr/lib/libldap-2.3.so.0.2.15.#prelink#.MN10ei
httpd   15826 apache  mem    REG        8,2 1009712    8585265 /lib/libdb-4.3.so
httpd   15826 apache  mem    REG        8,2  125744    8589007 /lib/libpthread-2.5.so
httpd   15826 apache  mem    REG        8,2   15704    8585423 /lib/libuuid.so.1.2
httpd   15826 apache  mem    REG        8,2            6764446 /usr/lib/libpq.so.4.1 (path inode=6765089)
httpd   15826 apache  mem    REG        8,2  101404    8589003 /lib/libnsl-2.5.so
httpd   15826 apache  mem    REG        8,2  133056    8589019 /lib/libexpat.so.0.5.0
httpd   15826 apache  mem    REG        8,2  190712    6764712 /usr/lib/libgssapi_krb5.so.2.2
httpd   15826 apache  mem    REG        8,2   16428    8589004 /lib/libdl-2.5.so
httpd   15826 apache  mem    REG        8,2  281116    8585251 /lib/libssl.so.0.9.8b
httpd   15826 apache  mem    REG        8,2   75028    6751429 /usr/lib/libz.so.1.2.3
httpd   15826 apache  mem    REG        8,2   33648    6764709 /usr/lib/libkrb5support.so.0.1
httpd   15826 apache  mem    REG        8,2    7880    8585403 /lib/libkeyutils-1.2.so
httpd   15826 apache  mem    REG        8,2    5500    6981504 /usr/lib/httpd/modules/mod_authn_file.so
httpd   15826 apache  mem    REG        8,2 1597968    8588999 /lib/libc-2.5.so
httpd   15826 apache  mem    REG        8,2    9628    6981376 /usr/lib/httpd/modules/mod_auth_basic.so
httpd   15826 apache  mem    REG        8,2    9632    6981500 /usr/lib/httpd/modules/mod_authn_alias.so
httpd   15826 apache  mem    REG        8,2    5500    6981501 /usr/lib/httpd/modules/mod_authn_anon.so
httpd   15826 apache  mem    REG        8,2    5500    6981381 /usr/lib/httpd/modules/mod_authn_dbm.so
httpd   15826 apache  mem    REG        8,2    5504    6981503 /usr/lib/httpd/modules/mod_authn_default.so
httpd   15826 apache  mem    REG        8,2    9628    6981509 /usr/lib/httpd/modules/mod_authz_host.so
httpd   15826 apache  mem    REG        8,2    5500    6981511 /usr/lib/httpd/modules/mod_authz_user.so
httpd   15826 apache  mem    REG        8,2    9600    6981510 /usr/lib/httpd/modules/mod_authz_owner.so
httpd   15826 apache  mem    REG        8,2    9668    6981508 /usr/lib/httpd/modules/mod_authz_groupfile.so
httpd   15826 apache  mem    REG        8,2  385180    6757974 /usr/lib/libsqlite3.so.0.8.6
httpd   15826 apache  mem    REG        8,2  600052    6764711 /usr/lib/libkrb5.so.3.3
httpd   15826 apache  mem    REG        8,2  157304    6764710 /usr/lib/libk5crypto.so.3.1
httpd   15826 apache  mem    REG        8,2    9628    6981506 /usr/lib/httpd/modules/mod_authz_dbm.so
httpd   15826 apache  mem    REG        8,2    5472    6981507 /usr/lib/httpd/modules/mod_authz_default.so
httpd   15826 apache  mem    REG        8,2   26112    6981505 /usr/lib/httpd/modules/mod_authnz_ldap.so
httpd   15826 apache  mem    REG        8,2    5536    6981416 /usr/lib/httpd/modules/mod_logio.so
httpd   15826 apache  mem    REG        8,2    5496    6981403 /usr/lib/httpd/modules/mod_env.so
httpd   15826 apache  mem    REG        8,2   17980    6981522 /usr/lib/httpd/modules/mod_ext_filter.so
httpd   15826 apache  mem    REG        8,2   22348    6981532 /usr/lib/httpd/modules/mod_mime_magic.so
httpd   15826 apache  mem    REG        8,2    9660    6981521 /usr/lib/httpd/modules/mod_expires.so
httpd   15826 apache  mem    REG        8,2   17916    6981399 /usr/lib/httpd/modules/mod_deflate.so
httpd   15826 apache  mem    REG        8,2   13820    6981408 /usr/lib/httpd/modules/mod_headers.so
....
etc...

Véis que muestra información de gran utilidad, como el servicio/comando al que pertenece el proceso (COMMAND), el PID, usuario que lo está ejecutando (USER), el descriptor de archivo (FD), tipo de nodo asociado con el fichero (TYPE), número de dispositivo (DEVICE), el tamaño del fichero y el nombre/ruta al mismo.

Recomiendo ver las páginas man (man lsof) para ver una descripción extendida de cada columna.

Listar ficheros abiertos en un dispositivo o partición:

Para evitar el típico fallo de no poder desmontarlo porque la partición está en uso:

lsof /particion

Comprobar servicios/puertos que están escuchando:

lsof -i -nP
COMMAND     PID    USER   FD   TYPE     DEVICE SIZE NODE NAME
portmap    2139     rpc    3u  IPv4       5220       UDP *:111
portmap    2139     rpc    4u  IPv4       5221       TCP *:111 (LISTEN)
rpc.statd  2164 rpcuser    3u  IPv4       5285       UDP *:647
rpc.statd  2164 rpcuser    6u  IPv4       5264       UDP *:644
rpc.statd  2164 rpcuser    7u  IPv4       5297       TCP *:650 (LISTEN)
sendmail   2437    root    4u  IPv4 1484615119       TCP 127.0.0.1:25 (LISTEN)
mysqld     2753   mysql   10u  IPv4  615583079       TCP *:3306 (LISTEN)
httpd      3063    root    3u  IPv6  583456545       TCP *:80 (LISTEN)
httpd      3063    root    5u  IPv6  583456550       TCP *:443 (LISTEN)

Listar ficheros abiertos de un determinado usuario:

lsof -u alex

COMMAND     PID USER   FD      TYPE     DEVICE      SIZE    NODE NAME
gnome-key  2862 alex  cwd       DIR        8,3      4096  107912 /var/lib/gdm
gnome-key  2862 alex  rtd       DIR        8,3      4096       2 /
gnome-key  2862 alex  txt       REG        8,3    588132    6979 /usr/bin/gnome-keyring-daemon
gnome-key  2862 alex  mem       REG        8,3     42974   76307 /usr/share/locale-langpack/es/LC_MESSAGES/glib20.mo
gnome-key  2862 alex  mem       REG        8,3    133662   76393 /usr/share/locale-langpack/es/LC_MESSAGES/libc.mo
gnome-key  2862 alex  mem       REG        8,3     42504    6194 /lib/tls/i686/cmov/libnss_files-2.9.so
gnome-key  2862 alex  mem       REG        8,3     38444    6198 /lib/tls/i686/cmov/libnss_nis-2.9.so
gnome-key  2862 alex  mem       REG        8,3     87804    6188 /lib/tls/i686/cmov/libnsl-2.9.so
gnome-key  2862 alex  mem       REG        8,3     30436    6190 /lib/tls/i686/cmov/libnss_compat-2.9.so
gnome-key  2862 alex  mem       REG        8,3     30765   76316 /usr/share/locale-langpack/es/LC_MESSAGES/gnome-keyring.mo
gnome-key  2862 alex  mem       REG        8,3    256316   13609 /usr/lib/locale/es_ES.utf8/LC_CTYPE
gnome-key  2862 alex  mem       REG        8,3        54   13614 /usr/lib/locale/es_ES.utf8/LC_NUMERIC
gnome-key  2862 alex  mem       REG        8,3      2378   13510 /usr/lib/locale/es_ES.utf8/LC_TIME
gnome-key  2862 alex  mem       REG        8,3    962106   13608 /usr/lib/locale/es_ES.utf8/LC_COLLATE
gnome-key  2862 alex  mem       REG        8,3     54740    2599 /lib/libgcc_s.so.1
gnome-key  2862 alex  mem       REG        8,3    149328    6185 /lib/tls/i686/cmov/libm-2.9.so
gnome-key  2862 alex  mem       REG        8,3    950424   10246 /usr/lib/libstdc++.so.6.0.10
gnome-key  2862 alex  mem       REG        8,3     99972    2663 /lib/libselinux.so.1
gnome-key  2862 alex  mem       REG        8,3      9676    6183 /lib/tls/i686/cmov/libdl-2.9.so
gnome-key  2862 alex  mem       REG        8,3     11468    2603 /lib/libgpg-error.so.0.3.0
gnome-key  2862 alex  mem       REG        8,3    608280   10215 /usr/lib/libsmbios.so.2.1.0
gnome-key  2862 alex  mem       REG        8,3    117092    9550 /usr/lib/libdbus-glib-1.so.2.1.0
gnome-key  2862 alex  mem       REG        8,3    338056    9345 /usr/lib/libORBit-2.so.0.1.0
...
...etc

Esto son solo unos pocos ejemplos de lo útil que puede resultar este comando, os recomiendo trastear un poco con él y veréis como seguro le sacáis partido en muchas ocasiones. Recordad:

man lsof