В Mac OS X, как я могу получить точное количество использования дескриптора файла?

В Linux ulimit -n можно использовать для изменения или просмотра ограничения на количество файловых дескрипторов для процесса и lsof -p nnn | wc -l похоже, последовательно сообщает о фактическом использовании дескриптора файла.

но на Mac OS X,lsof -p nnn | wc -l может возвращать число, превышающее предел. Полагаю, это означает lsof возвращает больше, чем просто файловые дескрипторы, но я не могу сказать, что к чему.

итог: как я могу получить точное количество использования дескриптора файла в Mac OS X?

4 ответов


lsof может показать много вещей, помимо только файловых дескрипторов, но большинство из того, что, вероятно, раздувает ваш счет, - это загруженные фреймворки и библиотеки для приложения. Вы можете посмотреть на столбец "FD", чтобы увидеть, является ли строка дескриптором файла-в этом случае это число, возможно, за которым следует буква, указывающая режим-или что-то еще (см. Описание столбца FD на странице руководства lsof для полного списка).

Если вам просто нужно грубое приближение, добавив " grep-v "txt "' перед вашим wc позволит вам намного ближе к точному значению. Если вам нужно точное значение, вам, вероятно, нужно собрать регулярное выражение для подачи вывода через эти файлы точно по столбцу FD.


я столкнулся с необходимостью идентификации этого недавно-команда, которую я использовал для подсчета общих записей (так больше, чем просто дескрипторы файлов, но ее относительная, поэтому соответствующая ИМО):

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

Это дает что-то вроде следующего вывода (ваши самые высокие используемые приложения могут отличаться!):

$lsof | awk '{print }' | 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

мне обычно нужно видеть только верхние 10 записей, но вы можете манипулировать head чтобы показать столько строк, сколько вы как.


Я искал, какой процесс имел много файловых дескрипторов-так что я думаю, что-то вроде

for pid in `ps aux | tail -n +2 | awk '{print }'`; do FCOUNT=`lsof -p $pid | grep -v " txt " | wc -l`; echo "PID: $pid $FCOUNT"; done | sort -nk3

Я изменил ответ Андерса, теперь он отображает только открытые номера FD определенного процесса:

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

пример:

$ ./fd-count.sh 5926                                                                                                           
PID: 5926       97