Cómo mostrar descriptores de archivos abiertos pero sin usar el comando lsof

48

Hola, he leído aquí que lsof no es una forma precisa de obtener el número de descriptores de archivos que están abiertos actualmente. Él recomendó usar este comando en su lugar

 cat /proc/sys/fs/file-nr

Si bien este comando muestra el número de FD, ¿cómo muestra la lista de descriptores de archivos abiertos que acaba de contar el comando anterior?

dimas
fuente
44
Probablemente quieras saber si tu límite es excedido, ¿verdad? Publiqué un blog sobre esto en linuxintro.org/wiki/Is_my_ulimit_exceeded ; lo más importante, el ulimit es una restricción por proceso que puede encontrar en / proc / PID / limits y en lugar de lsof, usaría ls / proc / PID / fd para enumerar los descriptores de archivo del proceso.
Thorsten Staerk

Respuestas:

60

Hay dos razones por las lsof | wc -lque no se cuentan los descriptores de archivo. Una es que enumera cosas que no son archivos abiertos, como bibliotecas cargadas vinculadas dinámicamente y directorios de trabajo actuales; necesitas filtrarlos. Otra es que lsoftarda un tiempo en ejecutarse, por lo que puede perder archivos que se abren o cierran mientras se ejecuta; por lo tanto, el número de archivos abiertos enumerados es aproximado. Mirar /proc/sys/fs/file-nrle da un valor exacto en un punto particular en el tiempo.

cat /proc/sys/fs/file-nrsolo es útil cuando necesita la cifra exacta, principalmente para verificar el agotamiento de los recursos. Si desea enumerar los archivos abiertos, debe llamar lsofo utilizar algún método equivalente, como el rastreo /proc/*/fdmanual.

Gilles 'SO- deja de ser malvado'
fuente
1
Hola, gracias por dar una buena explicación, Gilles. Intenté ls / proc / * / fd y obtuve todos los fd abiertos en ese momento. Está produciendo una salida con un poco de codificación de color, solo tendré que mirar el manual.
Dimas
Los /proc/*/fddirectorios @dimas contienen enlaces simbólicos a los archivos abiertos. Para inspección visual, uso ls -l. Para el tratamiento automatizado, utilice readlinkpara extraer el objetivo del enlace.
Gilles 'SO- deja de ser malvado'
Solo use ls -l pero experimentaré con readlink. Probé otras / proc / PID / maps y otras opciones como se especifica aquí kernel.org/doc/man-pages/online/pages/man5/proc.5.html . Gracias de nuevo por la información adicional.
Dimas
1
/ proc / sys / fs / file-nr me da 3872 (y otros dos números). ¿Cómo puede ser este el recuento de archivos que tengo abiertos si ulimit -n me muestra 1024?
Thorsten Staerk
1
@ThorstenStaerk Todas las configuraciones de setrlimit(la llamada al sistema subyacente al ulimitcomando de shell) son por proceso. Afectan solo el proceso que realiza la llamada (e indirectamente los procesos que luego se bifurca).
Gilles 'SO- deja de ser malvado'
25

El sistema mantiene dinámicamente la información del proceso en directorios bajo / proc. Por ejemplo, el proceso con PID 1234 tendrá un directorio llamado / proc / 1234.

Hay bastante información allí, pero en este momento está interesado en el subdirectorio / proc / 1234 / fd .

NOTA: Debe tener permisos de root para ver o abrir archivos para procesos que no son de su propiedad, así como para procesos SetUID.

Ejemplo:

root@johan-HP-ProBook-6560b-LG654EA-ACQ:/proc# ls -l 2443/fd
total 0
lr-x------ 1 johan johan 64 Feb 27 10:26 0 -> pipe:[13637]
l-wx------ 1 johan johan 64 Feb 27 10:26 1 -> /home/johan/.xsession-errors
lrwx------ 1 johan johan 64 Feb 27 10:26 10 -> anon_inode:[eventfd]
lrwx------ 1 johan johan 64 Feb 27 10:26 11 -> anon_inode:[eventfd]
lrwx------ 1 johan johan 64 Feb 27 10:26 12 -> socket:[39495]
lrwx------ 1 johan johan 64 Feb 27 10:26 13 -> anon_inode:[eventfd]
lr-x------ 1 johan johan 64 Feb 27 10:26 14 -> anon_inode:inotify
lrwx------ 1 johan johan 64 Feb 27 10:26 15 -> anon_inode:[eventfd]
l-wx------ 1 johan johan 64 Feb 27 10:26 16 -> pipe:[37885]
lr-x------ 1 johan johan 64 Feb 27 10:26 17 -> pipe:[37886]
l-wx------ 1 johan johan 64 Feb 27 10:26 2 -> /home/johan/.xsession-errors
l-wx------ 1 johan johan 64 Feb 27 10:26 21 -> pipe:[167984]
lr-x------ 1 johan johan 64 Feb 27 10:26 22 -> pipe:[167985]
l-wx------ 1 johan johan 64 Feb 27 10:26 23 -> pipe:[170009]
lr-x------ 1 johan johan 64 Feb 27 10:26 24 -> pipe:[170010]
lrwx------ 1 johan johan 64 Feb 27 10:26 3 -> anon_inode:[eventfd]
lr-x------ 1 johan johan 64 Feb 27 10:26 4 -> pipe:[14726]
lrwx------ 1 johan johan 64 Feb 27 10:26 5 -> socket:[14721]
l-wx------ 1 johan johan 64 Feb 27 10:26 6 -> pipe:[14726]
lrwx------ 1 johan johan 64 Feb 27 10:26 7 -> socket:[14730]
lrwx------ 1 johan johan 64 Feb 27 10:26 8 -> socket:[13984]
lrwx------ 1 johan johan 64 Feb 27 10:26 9 -> socket:[14767]

root@johan-HP:/proc# cat 2443/fdinfo/2
pos:    1244446
flags:  0102001

También eche un vistazo al resto de los archivos en / proc ... aquí se encuentra mucha información útil del sistema.

Johan
fuente