В Mac OS X, как я могу получить точное количество использования дескриптора файла?
В Linux ulimit -n
можно использовать для изменения или просмотра ограничения на количество дескрипторов файла для процесса, а lsof -p nnn | wc -l
, как представляется, постоянно сообщает о фактическом использовании дескриптора файла.
Но в Mac OS X lsof -p nnn | wc -l
можно вернуть число выше предела. Я полагаю, это означает, что lsof
возвращает больше, чем просто дескрипторы файлов, но я не могу сказать, что.
Нижняя строка: Как я могу получить точный подсчет использования дескриптора файла в Mac OS X?
Ответы
Ответ 1
lsof может отображать много вещей помимо дескрипторов файлов, но большая часть того, что, вероятно, раздувает ваш счет, - это загруженные фреймворки и библиотеки для приложения. Вы можете посмотреть столбец "FD", чтобы увидеть, является ли строка файловым дескриптором - в этом случае это число, возможно, за которым следует буква, указывающая режим, или что-то еще (см. Описание столбца FD в lsof man page для полного списка).
Если вам просто нужно приблизительное приближение, добавив "grep -v" txt ", прежде чем ваш wc поможет вам приблизиться к точному значению. Если вам нужно точное значение, вам, вероятно, нужно собрать регулярное выражение для подачи вывода через эти файлы фильтра точно в столбец FD.
Ответ 2
Я недавно столкнулся с необходимостью идентифицировать это - команда, которую я использовал для подсчета общего количества записей (не только для файловых дескрипторов, но и для их относительного, следовательно, релевантного imo):
lsof | awk '{print $1}' | uniq -c | sort -rn | head
Это дает что-то вроде следующего (ваши самые популярные приложения могут отличаться!):
$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
Мне обычно нужно видеть только первые 10 записей, но вы можете манипулировать head
чтобы показать столько строк, сколько хотите.
Ответ 3
Я искал, какой процесс имеет много файловых дескрипторов - так что я думаю, что-то вроде
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
Ответ 4
Я изменил ответ aners, теперь он отображает только открытые fd номера определенного процесса:
FCOUNT=`lsof -p $1 | grep -v " txt " | wc -l`;echo "PID: $1 $FCOUNT" | sort -nk3
Пример:
$ ./fd-count.sh 5926
PID: 5926 97