В 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