¿Cuál es la diferencia entre `lsof -p <pid> | wc -l` y `ls / proc / <pid> / fd | wc -l`?

12

Antecedentes: estoy jugando monitoreando el ulimit para ejecutar procesos para un usuario en particular. (Ocasionalmente había visto procesos que comenzaban con un límite incorrecto). Pregunté a un par de gurús de Linux autoproclamados, y uno sugirió lsof -p <pid>, mientras que el otro sugirió ls /proc/<pid>/fd, pero ninguno fue positivo sobre cuál refleja con mayor precisión el conteo real hacia el máximo Límite de archivos abiertos para un proceso.

Entonces, cual es?

lsof -p <pid> | wc -l

O

ls /proc/<pid>/fd | wc -l

Por favor, explique la diferencia. ¡Gracias!

Jared
fuente
3
Suena como tarea.
ewwhite
1
No tarea. Se agregó una mejor explicación. Había leído las lsofpáginas del manual, y aunque sospechaba que la respuesta eran archivos mapeados en memoria, quería la confirmación de una persona más experimentada.
Jared

Respuestas:

10

lsoftambién le proporcionará archivos .so asignados en memoria, que técnicamente no es lo mismo que un identificador de archivo sobre el que la aplicación tiene control. /proc/<pid>/fdes el punto de medición para los descriptores de archivos abiertos, sin embargo: Mencionado en la página proc-man, si el hilo principal de un programa multiproceso ha finalizado, este directorio no estará disponible.

lsof -p <pid> | grep -v mem | egrep -v '^COMMAND PID' | wc -lle mostrará los mismos artículos que ls /proc/<pid>/fd | wc -l.

Los mapas de memoria están disponibles en /proc/<pid>/maps.

Kvisle
fuente
El lsofle da casi la misma potencia, pero también incluye cwd, rtdy txtdescriptores de fichero.
Ian Bamforth
También tenga en cuenta que el número de espacios entre COMMANDy PIDpuede variar. Reemplace los espacios con [[:space:]]*para hacerlo más general.
Ian Bamforth
También encontré lsof -a -p <pid> -d ^mem -d ^cwd -d ^rtd -d ^txt -d ^DEL | wc -l aquí , mientras que lsofen Android shell ( adb shell) no es compatible -ay -d. Así que finalmente uso la versión de Kvisle.
Fin de semana