Разница между пределами ulimit -n и / proc / $ PID /

9

В Linux существует ограничение на количество открытых файлов. Я могу использовать, ulimit -nчтобы увидеть лимит открытых файлов, который по умолчанию составляет 1024. Затем я также могу увидеть мягкие / жесткие ограничения для каждого открытого процесса, посмотрев на / proc / $ PID / limit. Я вижу soft = 1024 и hard = 4096.

Мне интересно, в чем разница между этими двумя выходными?

Кроме того , делать setRlimit()и getRlimit()применять к общесистемным или в процессе?

sdeLevelNegativeTwo
источник

Ответы:

11

ulimit -nустанавливает мягкий предел по умолчанию; Вы можете добавить -Hопцию для просмотра / установки жесткого ограничения.

По большей части мягкие и жесткие ограничения ведут себя так:

  1. Процессы root (на самом деле, любой процесс с CAP_SYS_RESOURCE) может повысить или понизить любой предел любого процесса.
  2. процессы любого пользователя могут снизить любые ограничения на другие процессы, принадлежащие этому пользователю.
  3. процессы любого пользователя могут повысить мягкое ограничение до жесткого ограничения для процессов, принадлежащих этому пользователю.
  4. Если процесс пытается превысить свое мягкое ограничение, попытка завершится неудачей.

Таким образом, жесткие ограничения действуют как ограничение для мягких ограничений (за исключением root, который, как обычно, может делать все что угодно).

Есть исключение: мягкое ограничение ЦП посылает SIGXCPUсигнал. Процесс может решить игнорировать это, или тратить время на очистку и т. Д. После того, как жесткое ограничение ЦП пересекается, ядро ​​отправляет сообщение, SIGKILLкоторое невозможно отследить, обработать или игнорировать. Таким образом, в этом случае мягкое ограничение действует как предупреждение «у вас недостаточно времени процессора - завершите работу и завершите работу немедленно, или же!» и жесткий предел "или иначе".

Большинство из них для каждого процесса, но некоторые (например RLIMIT_NPROC) для каждого пользователя. Страница справочника getrlimit (2) указывает для каждого ограничения.

derobert
источник
Другой связанный вопрос, почему иногда моя оболочка имеет ulimit -n = 1024, а другой процесс, запущенный из этой оболочки, имеет мягкий предел = 4096 (чтение из / proc / PID /
limit
@sdeLevelNegativeTwo Вы запустили процесс до или после ulimit -n? Это не влияет на уже запущенные процессы, только на оболочку и будущие. Помимо этого, процесс может повышать свой мягкий предел до жесткого ограничения. Таким образом, вы можете использовать, ulimit -H -nчтобы остановить это.
Дероберт