Як я можу збільшити ліміт відкритих файлів для некорінного користувача?


143

Це відбувається в Ubuntu Release 12.04 (точний) 64-бітний Kernel Linux 3.2.0-25-virtual

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

Але навіть якщо я запускаю затемнення як root, моє додаток все одно виходить з ладу через виняток "Занадто багато відкритого файлу"!

Поки що я не знайшов жодного способу збільшити ліміт відкритих файлів для некорінного користувача.

Як я повинен правильно це робити? Я переглянув кілька інших постів, але не пощастило!


6
Також зауважте, що після редагування /etc/security/limits.confвам, можливо, доведеться вийти з системи, а потім знову ввійти, перш ніж ви зможете використовувати новий максимальний ліміт. Я зробив це, і був здивований тим, що ulimit -Hsвсе ще показував 1000, коли я щойно підняв його до 1000000! Потім я вийшов із системи та повернувся назад, і ulimit показав нову суму.
Серін

Для сеансу GUI може бути також важливим (Ubuntu 16+) цей потік .
Вальдемар Восіньський

Відповіді:


142

ulimitКоманда за замовчуванням змінює жорсткі обмеження, які ви (користувач) може знизити, але не може підняти.

Використовуйте опцію -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

1
Як змінити жорсткий ліміт на максимальну кількість відкритих дескрипторів файлів? Моя проблема полягає в тому, що мені потрібно дозволити моїй програмі Eclipse мати стільки відкритого файлу, скільки хоче, але обмеження 4096 недостатньо, і я хочу встановити його якомога вище, можливо, 500000. Моє налаштування в limit.conf це, як ви згадали зіркою, і все-таки жорсткий межа не рухається.
iCode

1
Ну, ви виявили, що значення / proc / sys / fs / file-max було 188 897 ... Тож я б сказав, що ваша верхня межа між 188 000 (дозволено) і 500 000 (не дозволено). Блукає розум, що у вас є щось, що вимагає понад 65000 відкритих файлів одночасно. Ого. Зазвичай це обробляється на великій залізі. Мені б з підозрою ставились до помилкового уявлення про програмування. (З усією повагою, будь ласка)
lornix

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

4
Я спробував це, оскільки у мене те саме питання, але це не вийшло$ sudo sysctl -w fs.inotify.max_user_watches=100000 fs.inotify.max_user_watches = 100000 $ ulimit -n 1024
grepmaster
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.