Применяются ли значения limit.conf для каждого отдельного процесса?


25

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

В частности, для следующего использования:

oracle                  hard    nofile                  65536

Ответы:


23

Большинство значений - limits.confэто ограничения, которые можно установить с помощью ulimitкоманды оболочки или 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
@laimison Нет. Предположим, что у пользователя есть только два процесса 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.