En Mac OS X, ¿cómo puedo obtener un recuento preciso del uso de descriptores de archivo?


En Linux, ulimit -n se puede usar para cambiar o ver el límite en el número de descriptores de archivo para un proceso, y lsof -p nnn | wc -l parece informar consistentemente el uso real del descriptor de archivo.

Pero en Mac OS X, lsof -p nnn | wc -l puede devolver un número mayor que el límite. Supongo que esto significa que lsof está devolviendo más que solo descriptores de archivo, pero no puedo decir qué es qué.

En pocas palabras: ¿Cómo puedo obtener un recuento preciso del uso de descriptores de archivo en Mac OS X?

Author: Zearin, 2009-04-28

4 answers

Lsof puede mostrar muchas cosas más allá de los descriptores de archivo, pero la mayor parte de lo que probablemente está inflando su recuento son los frameworks y bibliotecas cargadas para una aplicación. Puede mirar la columna " FD " para ver si una línea es un descriptor de archivo in en cuyo caso es un número, posiblemente seguido de una letra que indica el modo mode o algo más (vea la descripción de la columna FD en la página man de lsof para la lista completa).

Si solo necesita una aproximación aproximada agregando un 'grep-v "txt"' antes de su wc le llevará mucho más cerca de un valor exacto. Si necesita un valor exacto, probablemente necesite juntar una expresión regular para alimentar la salida a través de esos archivadores precisamente por la columna FD.

 10
Author: smorgan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-28 14:29:08

Me encontré con la necesidad de identificar esto recientemente - el comando que utilicé para contar el total de entradas (así que más que solo manejadores de archivos, pero su relativo por lo tanto imo relevante) es:

lsof | awk '{print $1}' | uniq -c | sort -rn | head

Esto da algo como la siguiente salida (sus aplicaciones más usadas pueden ser diferentes!):

$lsof | awk '{print $1}' | uniq -c | sort -rn | head 3271 com.apple 2978 Google 914 Atom\x20H 505 Skype 476 Microsoft 375 Screenher 304 Finder 292 Dock 277 Atom\x20H 270 Atom\x20H

Normalmente solo necesito ver las 10 entradas principales, pero puedes manipular head para mostrar tantas líneas como quieras.

 35
Author: PhillipHolmes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-13 17:45:10

Estaba buscando qué proceso tenía muchos descriptores de archivo, así que supongo que algo como

for pid in `ps aux | tail -n +2 | awk '{print $2}'`; do FCOUNT=`lsof -p $pid | grep -v " txt " | wc -l`; echo "PID: $pid $FCOUNT"; done | sort -nk3
 3
Author: anders.norgaard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-04 06:06:11

Modificé la respuesta de Anders, ahora solo muestra los números fd abiertos de un proceso específico:

FCOUNT=`lsof -p $1 | grep -v " txt " | wc -l`;echo "PID: $1 $FCOUNT" | sort -nk3

Ejemplo:

$ ./fd-count.sh 5926                                                                                                           
PID: 5926       97
 2
Author: laike9m,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-21 02:03:47