Как увеличить лимит открытых файлов для пользователя без полномочий root?

144

Это происходит в Ubuntu Release 12.04 (точная) 64-битное ядро ​​Linux 3.2.0-25-virtual

Я пытаюсь увеличить количество открытых файлов, разрешенных для пользователя. Это для моего Java-приложения Eclipse, где текущий предел 1024 недостаточно.

Согласно сообщениям, которые я нашел до сих пор, я должен иметь возможность

/etc/security/limits.conf вот так:

soft nofile 4096
hard nofile 4096

увеличить количество открытых файлов, разрешенных для всех пользователей.

Но это не работает для меня, и я думаю, что проблема не связана с этим файлом.

Для всех пользователей ограничение по умолчанию составляет 1024, независимо от того, что находится в /etc/security/limits.conf (я перезагружен после изменения этого файла)

$ ulimit -n
1024

Теперь, несмотря на записи в /etc/security/limits.conf, я не могу увеличить это:

$ ulimit -n 2048

-bash: ulimit: открыть файлы: невозможно изменить ограничение: операция не разрешена. Странная часть в том, что я могу изменить ограничение вниз , но не могу изменить его вверх - даже вернуться к числу, которое ниже исходного предела:

$ ulimit -n 800
$ ulimit -n
800

$ ulimit -n 900

-bash: ulimit: open files: cannot modify limit: Operation not permitted

Как корень, я могу изменить это ограничение на то, что я хочу, вверх или вниз. Кажется, он даже не заботится о якобы общесистемном ограничении в / proc / sys / fs / file-max

# cat /proc/sys/fs/file-max
188897

# ulimit -n 188898
# ulimit -n 
188898

Но даже когда я получаю eclipse для запуска с правами root, мое приложение по-прежнему падает из-за исключения «Too Many Open File»!

До сих пор я не нашел способа увеличить лимит открытых файлов для пользователя без полномочий root.

Как мне правильно сделать это? Я посмотрел на несколько других сообщений, но не повезло!

Icode
источник
6
Кроме того, обратите внимание, что после редактирования /etc/security/limits.confвам может потребоваться выйти из системы, а затем снова войти в нее, прежде чем вы сможете использовать новый максимальный предел. Я сделал это, и был сбит с толку, ulimit -Hsпоказав 1000, когда только что поднял его до 1000000! Затем я вышел из системы и снова вошел, и ulimit показал новую сумму.
Cerin
Для сеанса GUI вы также можете найти (Ubuntu 16+) эту тему .
Вальдемар Восински

Ответы:

142

Команда ulimitпо умолчанию изменяет ограничения HARD, которые вы (пользователь) можете снизить, но не можете повысить.

Используйте опцию -S для изменения предела SOFT , который может варьироваться от 0 до { HARD }.

Я на самом деле псевдонимы , ulimitчтобы ulimit -S, так что по умолчанию мягких ограничений всего времени.

alias ulimit='ulimit -S'

Что касается вашей проблемы, вы пропустите столбец в ваших записях в /etc/security/limits.conf.

Там должно быть ЧЕТЫРЕ столбца, но первый отсутствует в вашем примере.

* soft nofile 4096
* hard nofile 4096

В первом столбце описывается ВОЗ, на которую должен претендовать предел. «*» - это подстановочный знак, означающий всех пользователей. Чтобы повысить ограничения для root , вы должны явно ввести «root» вместо «*».

Вам также нужно отредактировать /etc/pam.d/common-session*и добавить в конец следующую строку:

session required pam_limits.so
lornix
источник
1
Как изменить жесткое ограничение для максимального количества дескрипторов открытых файлов? Моя проблема заключается в том, что мне нужно, чтобы у моего приложения Eclipse было столько открытых файлов, сколько нужно, но ограничение в 4096 недостаточно, и я хочу установить его на максимально возможное значение, возможно, 500000. Моя настройка в limit.conf как вы упомянули со звездой, и все же жесткий предел не движется.
iCode
1
Итак, вы обнаружили, что значение / proc / sys / fs / file-max было 188 897 ... Итак, я бы сказал, что ваш верхний предел составляет от 188 000 (разрешено) до 500 000 (не разрешено). Поразительно, что у вас есть то, что требует более 65000 открытых файлов одновременно. Ух ты. Обычно это делается на железо. Я бы с подозрением относился к программированию, ошибочное мнение. (При всем
моем
4
вот и все: сеанс требует pam_limits.so, спасибо!
летчик
13
Сначала я пропустил подстановочный знак в конце /etc/pam.d/common-session*и только что отредактировал common-session, и даже после перезагрузки он не работал. Но после добавления той же строки (для pam_limits.so) в common-session-noninteractive, ulimit -nотображается новое значение после нового входа в систему (перезагрузка не требуется). FWIW Я пытался изменить ограничение для root (только).
Ламбарт
1
также проверьте, если значение отличается, если вы вошли в систему как root. superuser.com/questions/1200539/…
Robbo_UK
20

Если вы используете мягкие и жесткие ограничения для каждого пользователя, вы можете использовать что-то вроде:

su USER --shell /bin/bash --command "ulimit -n"

проверить, работают ли ваши настройки для этого конкретного пользователя или нет.

Йерун Теувен
источник
5

У меня много проблем, чтобы заставить это работать.

Использование следующего позволяет обновлять его независимо от вашего разрешения пользователя.

sudo sysctl -w fs.inotify.max_user_watches=100000
Layke
источник
4
Я пробовал это, так как у меня та же проблема, но она не работала$ sudo sysctl -w fs.inotify.max_user_watches=100000 fs.inotify.max_user_watches = 100000 $ ulimit -n 1024
grepmaster