Применяются ли значения 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 (), а не ограничение в родительском процессе или в любом другом процессе.
Жиль "ТАК - перестань быть злым"