Як відобразити відкриті дескриптори файлів, але не використовуючи команду lsof


48

Привіт я прочитав тут , що Lsof не є точним способом отримати кількість дескрипторів файлів, які в даний час відкриті. Він рекомендував використовувати цю команду замість цього

 cat /proc/sys/fs/file-nr

Хоча ця команда відображає кількість FD, як ви відображаєте список відкритих дескрипторів файлів, які команда вище тільки що підрахувала?


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 і отримав усі відкриті fd на той час. Випускаючи вихід із деяким кольоровим кодуванням, мені доведеться лише переглянути посібник.
димас

Каталоги @dimas /proc/*/fdмістять символьні посилання на відкриті файли. Для візуального огляду використовуйте ls -l. Для автоматизованого лікування використовуйте readlinkдля вилучення цілі посилання.
Жил "ТАК - перестань бути злим"

Просто використовуйте ls -l, але я буду експериментувати з readlink. Я спробував інші / proc / PID / карти та інші параметри, як зазначено тут 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 ... тут розміщується багато корисної інформації з системи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.