Как lsof может сообщать о большем количестве открытых файлов, чем, как говорит ulimit, должно быть разрешено?

Как lsof может сообщать о большем количестве открытых файлов, чем то, что, как говорит ulimit, является пределом?

prod_web3(i-ca0b05aa):~$ sudo lsof | wc -l
4399
prod_web3(i-ca0b05aa):~$ ulimit -n
1024

4 ответа

Решение

Из справочной страницы ulimit buildins

The ulimit builtin provides control over the resources available to the shell 
and to processes started by it on systems that allow such control.

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

Распространенная ошибка - сравнивать результат необработанного вызова lsof с предполагаемым лимитом.

Для глобального ограничения (/proc/sys/fs/file-max) вы должны взглянуть на /proc/sys/fs/file-nr -> значение fist указывает, что используется, а последнее значение - ограничение

Ограничение OpenFile для каждого процесса, но может быть определено для пользователя, см. Команду "ulimit -Hn" для ограничений пользователя и см. /Etc/security/limits.conf для определений. Обычно применяется с "пользователем приложения", например:"tomcat": установите ограничение в 65000 для пользователя tomcat, который будет применяться к процессу Java, который он запускает.

Если вы хотите проверить лимит, примененный к процессу, получите его PID, а затем: cat /proc/${PID}/limit. Если вы хотите проверить, сколько файлов открывается процессом, получите его PID, а затем: ls -1 /proc/{PID}/fd | wc -l (обратите внимание, для ls это "минус один", не путать с "минус эль")

Если вы хотите узнать подробности с помощью lsof, но только для тех обработчиков файлов, которые учитывают лимит, попробуйте выполнить следующее: lsof -p ${PID} | grep -P "^(\w+\s+){3}\d+\D+" lsof -p ${PID} -d '^cwd,^err,^ltx,^mem,^mmap,^pd,^rtd,^txt' -a

Примечание: "файлы" - это файлы / pipe / TCP-соединения / и т. Д.

Обратите внимание, что иногда вам, вероятно, понадобится быть пользователем root или использовать sudo для получения правильного результата для команд, без привилегий иногда у вас не будет ошибок, только меньше результатов.

и, наконец, если вы хотите узнать, к каким "файлам" в вашей файловой системе обращается процесс, взгляните на: lsof -p {PID} | grep / | awk '{print $9}' | сортировать | уник

повеселись!

Хотя это старое, я хотел задать тот же вопрос... ответ не является удовлетворительным в моем случае, как это происходит:

$ sudo su tomcat -c "ulimit -n"
1024
$ lsof -u tomcat
3967

Я не совсем уверен, почему это произошло. Я предполагаю, что открытые файлы из подпроцесса не учитываются в родительском.

Встроенная в bash(1) функция ulimit определяет максимальное количество открытых файлов на процесс.

Это не общесистемная настройка в любом случае.

Другие вопросы по тегам