Как отобразить дескрипторы открытых файлов, но не используя команду lsof

48

Привет, я прочитал здесь, что lsof не является точным способом получения количества файловых дескрипторов, которые в настоящее время открыты. Он рекомендовал использовать эту команду вместо

 cat /proc/sys/fs/file-nr

В то время как эта команда отображает количество FD, как вы отображаете список дескрипторов открытых файлов, которые только что подсчитала команда выше?

Dimas
источник
4
Вы, вероятно, хотите знать, превышен ли ваш предел, верно? Я писал об этом в linuxintro.org/wiki/Is_my_ulimit_exceeded ; наиболее важно, что ulimit - это ограничение для каждого процесса, которое вы можете найти в / proc / PID / limit, и вместо lsof я бы использовал ls / proc / PID / fd для отображения файловых дескрипторов процесса.
Торстен Стаерк

Ответы:

60

Есть две причины lsof | wc -l, по которым файловые дескрипторы не учитываются. Во-первых, в нем перечислены вещи, которые не являются открытыми файлами, такие как загруженные динамически связанные библиотеки и текущие рабочие каталоги; вам нужно отфильтровать их. Другой - это lsofзапуск некоторого времени, поэтому он может пропустить файлы, которые открываются или закрываются во время работы; поэтому число открытых файлов в списке является приблизительным. Глядя на это /proc/sys/fs/file-nrдает вам точное значение в определенный момент времени.

cat /proc/sys/fs/file-nrполезно только тогда, когда вам нужна точная цифра, в основном для проверки исчерпания ресурсов. Если вы хотите перечислить открытые файлы, вам нужно вызвать lsofили использовать какой-либо эквивалентный метод, такой как траление /proc/*/fdвручную.

Жиль "ТАК - перестань быть злым"
источник
1
Привет, спасибо за хорошее объяснение, Жиль. Я попробовал ls / proc / * / fd и получил все открытые файлы в то время. Он производит вывод с некоторой цветовой кодировкой, мне просто нужно посмотреть руководство.
Димас
Каталоги @dimas /proc/*/fdсодержат символические ссылки на открытые файлы. Для визуального осмотра используйте ls -l. Для автоматического лечения используйте readlinkдля извлечения цели ссылки.
Жиль "ТАК - перестать быть злым"
Просто используйте ls -l, но я поэкспериментирую с readlink. Я пробовал другие / proc / PID / maps и другие опции, как указано здесь kernel.org/doc/man-pages/online/pages/man5/proc.5.html . Еще раз спасибо за дополнительную информацию.
Димас
1
/ proc / sys / fs / file-nr дает мне 3872 (и два других числа). Как это может быть количество открытых файлов, если ulimit -n показывает 1024?
Торстен Стаерк
1
@ThorstenStaerk Все настройки setrlimit(системный вызов, лежащий в основе команды ulimitоболочки) относятся к каждому процессу. Они влияют только на процесс, который выполняет вызов (и косвенно на процессы, которые он позднее разветвляет).
Жиль "ТАК - перестань быть злым"
25

Информация о процессе динамически хранится системой в каталогах в / proc. Например, процесс с PID 1234 будет иметь каталог с именем / proc / 1234.

Там довольно много информации, но сейчас вы заинтересованы в подкаталоге / proc / 1234 / fd .

ПРИМЕЧАНИЕ. Для просмотра или открытия файлов необходимо иметь права суперпользователя для процессов, которые вам не принадлежат, а также для процессов SetUID.

Пример:

root@johan-HP-ProBook-6560b-LG654EA-ACQ:/proc# ls -l 2443/fd
total 0
lr-x------ 1 johan johan 64 Feb 27 10:26 0 -> pipe:[13637]
l-wx------ 1 johan johan 64 Feb 27 10:26 1 -> /home/johan/.xsession-errors
lrwx------ 1 johan johan 64 Feb 27 10:26 10 -> anon_inode:[eventfd]
lrwx------ 1 johan johan 64 Feb 27 10:26 11 -> anon_inode:[eventfd]
lrwx------ 1 johan johan 64 Feb 27 10:26 12 -> socket:[39495]
lrwx------ 1 johan johan 64 Feb 27 10:26 13 -> anon_inode:[eventfd]
lr-x------ 1 johan johan 64 Feb 27 10:26 14 -> anon_inode:inotify
lrwx------ 1 johan johan 64 Feb 27 10:26 15 -> anon_inode:[eventfd]
l-wx------ 1 johan johan 64 Feb 27 10:26 16 -> pipe:[37885]
lr-x------ 1 johan johan 64 Feb 27 10:26 17 -> pipe:[37886]
l-wx------ 1 johan johan 64 Feb 27 10:26 2 -> /home/johan/.xsession-errors
l-wx------ 1 johan johan 64 Feb 27 10:26 21 -> pipe:[167984]
lr-x------ 1 johan johan 64 Feb 27 10:26 22 -> pipe:[167985]
l-wx------ 1 johan johan 64 Feb 27 10:26 23 -> pipe:[170009]
lr-x------ 1 johan johan 64 Feb 27 10:26 24 -> pipe:[170010]
lrwx------ 1 johan johan 64 Feb 27 10:26 3 -> anon_inode:[eventfd]
lr-x------ 1 johan johan 64 Feb 27 10:26 4 -> pipe:[14726]
lrwx------ 1 johan johan 64 Feb 27 10:26 5 -> socket:[14721]
l-wx------ 1 johan johan 64 Feb 27 10:26 6 -> pipe:[14726]
lrwx------ 1 johan johan 64 Feb 27 10:26 7 -> socket:[14730]
lrwx------ 1 johan johan 64 Feb 27 10:26 8 -> socket:[13984]
lrwx------ 1 johan johan 64 Feb 27 10:26 9 -> socket:[14767]

root@johan-HP:/proc# cat 2443/fdinfo/2
pos:    1244446
flags:  0102001

Также взгляните на остальные файлы в / proc ... здесь содержится много полезной информации из системы.

Johan
источник