Inicio > Administracion, Linux > Listando ficheros abiertos en Linux con LSOF

Listando ficheros abiertos en Linux con LSOF

domingo, 8 de marzo de 2009 Dejar un comentario Ir a comentarios

 

Lsof es una aplicación muy interesante desarrollada por Vic Abell y disponible en prácticamente todas las distribuciones Linux que nos puede llegar a ser muy útil para diferentes propósitos.
.

En Debian

apt-cache search lsof
lsof – List open files

apt-get install lsof

Algo que a todos nos ha pasado es montar una unidad de CDRom, y cuando llega el momento de desmontarla, nos sale un mensajito de que el dispositivo esta en uso:

vi /etc/fstab

# /etc/fstab: static file system information.

#

# <file system> <mount point> <type> <options> <dump> <pass>

/dev/scd0 /media/cdrom0 udf,iso9660 user,noauto 0 0

mount /dev/scd0
mount: dispositivo de bloques /dev/scd0 está protegido contra escritura; se monta como sólo lectura

mount
/dev/scd0 on /media/cdrom0 type iso9660 (ro,noexec,nosuid,nodev,user=pedimave)

cd /media/cdrom0
umount /dev/scd0

umount: /media/cdrom0: dispositivo ocupado
umount: /media/cdrom0: dispositivo ocupado

¿ Porque no nos desmonta el dispositivo ?. La respuesta es: porque estamos en el directorio en el que se ha montado el CDROM, y como reconoce que esta en uso, la operación no esta permitida.

En este caso es sencillo detectar el problema, y únicamente saliendo del directorio solucionamos el problema. Pero que sucede si tenemos varios terminales abiertos, Administradores de Archivos…, o simplemente que un proceso se haya quedado tarumba.

lsof +D /media/cdrom0 (+D – busca todas las instancias abiertas contra ese directorio)

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 8795 pedimave cwd DIR 11,0 936 5440 /media/cdrom0

Es este caso vemos que se trata de una sesión que tenemos abierta desde nuestro terminal.

Vemos que nos da un dato muy interesante que es el PID (Identificativo de proceso).

Otro ejemplo en este estilo:

lsof /etc/passwd

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
python 6848 pedimave 12r REG 8,2 2160 2642598 /etc/passwd
soffice.b 10339 pedimave 46r REG 8,2 2160 2642598 /etc/passwd

Ahora ya podemos proceder a cerrar las aplicaciones que hacen uso del dispositivo montado, o podemos usar nuestro comando kill y matar el proceso en cuestion

kill PID (si se resiste kill -9 PID)

Esta herramienta se puede utilizar también en el caso de que queramos descubrir que aplicación esta corriendo en un determinado puerto.

Si hacemos uso de otra aplicación netstat (de la que ya hablaremos mas adelante), nos va a mostrar las conexiones que tenemos abiertas y escuchando, identificando la aplicación que esta corriendo por detras.

netstat -ano (ja,ja me extraña que se os olvide)

Conexiones activas de Internet (servidores y establecidos)

Protocolo Recv-Q Send-Q Dirección Local Dirección Externa Estado Temporizador
tcp 0 0 0.0.0.0:6881 0.0.0.0:* ESCUCHAR apagado (0.00/0/0)
tcp 0 0 0.0.0.0:8001 0.0.0.0:* ESCUCHAR apagado (0.00/0/0)
tcp 0 0 0.0.0.0:2628 0.0.0.0:* ESCUCHAR apagado (0.00/0/0)
tcp 0 0 0.0.0.0:139 0.0.0.0:* ESCUCHAR apagado (0.00/0/0)
tcp 0 0 0.0.0.0:80 0.0.0.0:* ESCUCHAR apagado (0.00/0/0)
tcp 0 0 0.0.0.0:6000 0.0.0.0:* ESCUCHAR apagado (0.00/0/0)
tcp 0 0 0.0.0.0:21 0.0.0.0:* ESCUCHAR apagado (0.00/0/0)
tcp 0 0 127.0.0.1:8118 0.0.0.0:* ESCUCHAR apagado (0.00/0/0)
tcp 0 0 0.0.0.0:26998 0.0.0.0:* ESCUCHAR apagado (0.00/0/0)
tcp 0 0 127.0.0.1:631 0.0.0.0:* ESCUCHAR apagado (0.00/0/0)
tcp 0 0 127.0.0.1:25 0.0.0.0:* ESCUCHAR apagado (0.00/0/0)
tcp 0 0 127.0.0.1:9050 0.0.0.0:* ESCUCHAR apagado (0.00/0/0)
tcp 0 0 0.0.0.0:445 0.0.0.0:* ESCUCHAR apagado (0.00/0/0)

Y nos llama por ejemplo la atención, que tenemos el puerto 21 abierto y nosotros no disponemos de ningún servidor FTP.

Podemos descubrir que aplicación esta corriendo en ese puerto.

lsof -i:21

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
pure-ftpd 5831 root 4u IPv4 14132 TCP *:ftp (LISTEN)
pure-ftpd 5831 root 5u IPv6 14134 TCP *:ftp (LISTEN)

Y ver ahora los archivos asociados a ese proceso (PID):

lsof -p 5831

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
pure-ftpd 5831 root cwd DIR 8,2 4096 2 /
pure-ftpd 5831 root rtd DIR 8,2 4096 2 /
pure-ftpd 5831 root txt REG 8,2 135324 2743252 /usr/sbin/pure-ftpd
pure-ftpd 5831 root mem REG 8,2 81240 2742604 /usr/lib/libz.so.1.2.3.3
pure-ftpd 5831 root mem REG 8,2 1364388 1458243 /lib/tls/i686/cmov/libc-2.7.so
pure-ftpd 5831 root mem REG 8,2 37956 2851674 /lib/libpam.so.0.81.6
pure-ftpd 5831 root mem REG 8,2 10316 2850839 /lib/libcap.so.1.10
pure-ftpd 5831 root mem REG 8,2 9684 1458527 /lib/tls/i686/cmov/libdl-2.7.so
pure-ftpd 5831 root mem REG 8,2 38300 1458504 /lib/tls/i686/cmov/libcrypt-2.7.so
pure-ftpd 5831 root mem REG 8,2 1300836 1507334 /usr/lib/i686/cmov/libcrypto.so.0.9.8
pure-ftpd 5831 root mem REG 8,2 264420 1507335 /usr/lib/i686/cmov/libssl.so.0.9.8
pure-ftpd 5831 root mem REG 8,2 109152 3932206 /lib/ld-2.7.so
pure-ftpd 5831 root 0r CHR 1,3 6673 /dev/null
pure-ftpd 5831 root 1w CHR 1,3 6673 /dev/null
pure-ftpd 5831 root 2w CHR 1,3 6673 /dev/null
pure-ftpd 5831 root 3u unix 0xdfa0e1c0 14129 socket
pure-ftpd 5831 root 4u IPv4 14132 TCP *:ftp (LISTEN)
pure-ftpd 5831 root 5u IPv6 14134 TCP *:ftp (LISTEN)

En el man de lsof tenemos muchísimos mas comandos que pueden ser de utilidad.

Algún ejemplito mas que nos puede venir muy bien.

lsof -c bash

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 6814 pedimave rtd DIR 8,2 4096 2 /
bash 6814 pedimave txt REG 8,2 702160 2738731 /bin/bash
bash 6814 pedimave mem REG 8,2 38412 1458533 /lib/tls/i686/cmov/libnss_files-2.7.so
bash 6814 pedimave mem REG 8,2 83708 1458530 /lib/tls/i686/cmov/libnsl-2.7.so
bash 6814 pedimave mem REG 8,2 30436 1458531 /lib/tls/i686/cmov/libnss_compat-2.7.so
bash 6814 pedimave mem REG 8,2 33365 3555496 /usr/share/locale-langpack/es/LC_MESSAGES/bash.mo
bash 6814 pedimave mem REG 8,2 254076 2803207 /usr/lib/locale/es_ES.utf8/LC_CTYPE

lsof -u »www-data»

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
apache2 8818 www-data cwd DIR 8,2 4096 2 /
apache2 8818 www-data rtd DIR 8,2 4096 2 /
apache2 8818 www-data txt REG 8,2 348908 2737449 /usr/sbin/apache2
apache2 8818 www-data mem REG 8,2 38412 1458533 /lib/tls/i686/cmov/libnss_files-2.7.so
apache2 8818 www-data mem REG 8,2 34352 1458535 /lib/tls/i686/cmov/libnss_nis-2.7.so
apache2 8818 www-data mem REG 8,2 83708 1458530 /lib/tls/i686/cmov/libnsl-2.7.so
apache2 8818 www-data mem REG 8,2 30436 1458531 /lib/tls/i686/cmov/libnss_compat-2.7.so

lsof -u USER -rminutos (Examinar los archivos abiertos por un determinado usuario cada x minutos)

…y i lo ejecutamos sin argumentos nos mostrara todos los procesos haciendo uso de ficheros

lsof | less

Saludos compañeros.

Enviar a un amigo: Share this page via Email
  1. Sin comentarios aún.
  1. Sin trackbacks aún.