===== Как проверить все открытые файлы пользователем или процессом в Linux ===== {{:unix-linux:linux-cli-tools:pasted:20180609-121717.png }} В некоторых ситуациях на Linux могут возникать ошибки, связанные с превышением лимита использования файловых дескрипторов. Эти лимиты накладываются как самим ядром Linux, так и его программными модулями, например PAM. \\ ==== Лимит ядра Linux ==== Узнать текущее значение максимального количества файловых дескрипторов, определяемое ядром Linux можно командой:
# cat /proc/sys/fs/file-max
Этот лимит может быть изменён без перезагрузки системы (начинает действовать сразу и действует до перезагрузки):
# echo "1221724" > /proc/sys/fs/file-max
Чтобы требуемое значение использовалось постоянно, то есть действовало и после перезагрузки, его необходимо определить в конфиг.файле ''/etc/sysclt.conf'': ... fs.file-max=1221724 ... \\ ==== Методика подсчёта открытых файлов ==== Для получения информации о количестве всех открытых файлов всеми процессами в Linux некоторые "знатоки" предлагают использовать команду типа
# lsof | wc -l
Однако такая команда показывает гораздо большее значение, чем всего открыто файлов в системе на данный момент на самом деле. Это связано с тем, что по несколько раз в подсчёт попадают одни и теже открытые файлы, используемые разными процессами. Поэтому проще для получения общего числа открытых файлов использовать данные ядра Linux
# cat /proc/sys/fs/file-nr
5248 0 610862
Первое число - общее количество занятых/используемых на данный момент времени файловых дескрипторов.\\ Второе число - количество выделенных процессам, но не используемых в данный момент дескрипторов.\\ Третье число - максимальное количество открытых дескрипторов \\ ==== Примеры получения данных ==== Получить список TOP-20 процессов с самым большим количеством открытых файловых дескрипторов:
# for x in `ps -eF| awk '{ print $2 }'`; \
 do echo `ls /proc/$x/fd 2> /dev/null | \
 wc -l` $x `cat /proc/$x/cmdline 2> /dev/null`; \
 done | sort -n -r | head -n 20
Подсчитать количество открытых файлов в разрезе процессов (в первой колонке будет выведен PID процесса, во второй количество открытых файлов этим процессом):
# ps aux | sed 1d | awk \
 '{print "fd_count=$(lsof -p " $2 " | wc -l) && echo " $2 " $fd_count"}' | \
 xargs -I {} bash -c {}
Посмотреть открытые файловые дескрипторы во всех процессах для отдельно взятого пользователя, например "apache"
# lsof -u apache
Подсчитать количество открытых файлов в каждом процессе для отдельно взятого пользователя:
# lsof -u apache | awk '{print $2}' | sort | uniq -c | sort -n
Тоже самое, только в реальном режиме времени:
# watch 'lsof -u vdsm | awk '\''{print $2}'\'' | sort | uniq -c | sort -n'
Посмотреть открыте файловые дескриптры для отдельно взятого процесса (по PID процесса):
# lsof -p 9189
Подсчитать количество файловых дескриптров для отдельно взятого процесса:
# lsof -p 9189 | wc -l
---- Дополнительные источники информации: * [[https://blog.dtulyakov.ru/2015/02/files-max.html|Блог Дениса Тулякова - Количество открытых файлов, сокетов]] ---- Проверено на следующих конфигурациях: ^ Версия ОС ^ |Debian GNU/Linux 8.10 (jessie) | ---- {{:user:blogroot.png?50&nolink |}} Автор первичной редакции:\\ [[user:blogroot|Алексей Максимов]] \\ Время публикации: 09.06.2018 11:18 {{tag>Linux Kernel "File server" "File system" PAM Shell}} ~~DISCUSSION~~