El comando ‘lsof’
Publicado el 19 de Marzo ,2008 por ekhtorComo ya sabemos, Linux trabaja sólo con ficheros. Los dispositivos son ficheros, los sockets son ficheros, los directorios… todo a lo que se pueda acceder estará representado en nuestro disco como un fichero más.Por ello, el comando ‘lsof’, puede sernos de gran utilidad.
Éste comando, nos muestra una lista en la que podemos ver los procesos y a qué ficheros están accediendo, lo que significa, que también podemos ver los dispositivos que usan. Si introducimos el comando lsof en consola podremos ver todos los procesos y donde acceden, pero es bastante caótico y no mostrará una información eficiente, asique a continuación veremos los parámetros más usados.
Si lo que queremos es ver los ficheros que están abiertos por un proceso determinado usaremos la opción -p seguida del PID del proceso (como recordatorio, el PID de los procesos se puede ver con el comando ‘ps -A’). Por ejemplo, si queremos ver cuantos ficheros está usando la consola cuyo PID es 16055 escribimos:
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 16055 ekhtor cwd DIR 3,1 4096 6275074 /home/ekhtor
bash 16055 ekhtor rtd DIR 3,1 4096 2 /
bash 16055 ekhtor txt REG 3,1 701680 425989 /bin/bash
bash 16055 ekhtor mem REG 3,1 109148 8929293 /lib/ld-2.6.1.so
bash 16055 ekhtor 0u CHR 136,0 2 /dev/pts/0
bash 16055 ekhtor 1u CHR 136,0 2 /dev/pts/0
bash 16055 ekhtor 2u CHR 136,0 2 /dev/pts/0
bash 16055 ekhtor 255u CHR 136,0 2 /dev/pts/0
De ésta forma podemos observar con total transparencia a qué ficheros accede la consola.
Si por el contrario queremos saber cuantos ficheros tienen abiertos los procesos, para saber cual es el que más carga el sistema, podemos hacerlo agrupando la salida con awk, ordenando con sort y contando el numero de ficheros con uniq:
4 acpid
4 aio/0
4 ata/0
4 ata_aux
4 atd
8 avahi-dae
16 awk
29 bash
9 blueproxi
96 bluetooth
73 bonobo-ac
1 COMMAND
9 compiz
143 compiz.re
4 console-k
4 cron
4 cupsd
45 dbus-daem
4 dd
4 dhcdbd
4 dhclient3
136 emerald
4 events/0
436 evolution
Se puede dar el caso de que un proceso está superando el límite de acceso a ficheros del sistema, y gracias al comando anterior, podremos ver el proceso culpable.
Para ver el límite que tiene nuestro sistema ejecutamos el comando sysctl fs.file-max:
fs.file-max = 101755
Y para modificar este límite:

