Чи застосовуються значення limit.conf на основі кожного процесу?


25

Я налаштовую nofileзначення /etc/security/limits.confдля свого користувача Oracle, і у мене виникає питання щодо його поведінки: чи nofileобмежує загальна кількість файлів, які користувач може відкрити для всіх своїх процесів, чи обмежує загальну кількість файлів, які може мати користувач відкритий для кожного з його процесів?

Зокрема, для наступного використання:

oracle                  hard    nofile                  65536

Відповіді:


23

Більшість значень¹ in - limits.confце межі, які можна встановити за допомогою ulimitкоманди shell або setrlimitсистемного виклику. Вони є властивостями процесу. Обмеження застосовуються незалежно для кожного процесу. Зокрема, кожен процес може мати до nofileвідкритих файлів. Не існує обмеження кількості відкритих файлів, накопичених процесами користувача.

nprocМежа трохи особливий випадок, в тому , що вона підсумувати всі процеси користувача. Тим не менш, він все ще застосовується до кожного процесу: коли процес викликає forkстворення нового процесу, виклику відмовляється, якщо кількість процесів, що належать до euid процесу, буде більшою за значення процесу RLIMIT_NPROC.

Сторінка " limits.confman" пояснює, що обмеження застосовуються до сеансу. Це означає, що всі процеси в сеансі матимуть ці самі обмеження (якщо вони не будуть змінені одним із цих процесів). Це не означає, що будь-яка сума проводиться за процеси в сеансі (це навіть не те, що відстежує операційна система - є поняття сеансу, але воно більш тонке, ніж це, наприклад, кожна програма X11 має тенденцію закінчуватися вгору на власній сесії). Як це працює, це те, що процес входу встановлює собі певні межі, і вони успадковуються усіма дочірніми процесами.

¹ Винятки є maxlogins, maxsysloginsі chrootякі застосовуються як частина процесу входу для заборони або впливу на вхід.


І навпаки, чи означає, що різні сеанси можуть мати різні набори обмежень?
CMCDragonkai

1
@CMCDragonkai Так, наприклад, якщо вони були limit.confзмінені між часом відкриття сеансу, або якщо встановлено різні обмеження (вони повинні бути меншими, крім кореневих) .profile.
Жил "ТАК - перестань бути злим"

1
@laimison Якщо ви повторите всі запущені процеси та запустите prlimit --pid $pidкожен, ви можете ефективно змінити ліміт активного сеансу. Зверніть увагу, що вам, можливо, доведеться це зробити кілька разів, якщо деякі процеси розщедриться під час ітерації.
Жил "ТАК - перестань бути злим"

1
Припустимо, що у користувача є лише два процеси A і B, при цьому RLIMIT_NPROCвстановлено 2 в A і 3 в B. Тоді B може форсувати ще один процес, але A не може.
Жил "ТАК - перестань бути злим"

1
@laimison Якщо ви встановите ліміт на 2 у батьківського B і не змінюєте його на B після розкрутки, то межа B буде дорівнює 2. Якщо ви встановите ліміт на 2 у батьківському B, але ви підвищите ліміт у B, або якщо ви встановите ліміт на 3 в батьківському B перед розщепленням B і встановите його на 2 після розгортання B, B буде встановити обмеження на 3. Єдине, що має значення, це обмеження у процесі, який викликає fork (), а не межа в батьківському процесі цього процесу або в будь-якому іншому процесі.
Жил "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.