Выполнение «вилочной бомбы» безопасно

Мы все видели «вилочную бомбу», которая сделает хост невосприимчивым, даже если он будет выполнен в непривилегированной оболочке:

Предупреждение. Не выполняйте следующий сценарий оболочки. Только не надо.

:(){ :|:& };: 

Я также знаю группы, структуру группировки процессов на уровне ядра Linux, которая может назначать «контроллеры» для ограничения памяти, потребления ЦП, приоритета планирования ввода-вывода и т. Д.

Теоретически, это должно быть возможным использовать этот механизм управления, чтобы позволить пользователю выполнить вилку бомбы в своей собственной оболочке, не приведя хост-систему к обходу.

Поскольку я не знаю, как бомба для вилки потребляет ресурсы, я не уверен, как использовать cgroups для этого.

Насколько я могу судить, я думаю, что группы будут переполнены здесь. Тем не менее, я обычно использую ulimit всякий раз, когда я запускаю что-то witk в системный вызов fork (плохой опыт сделал это привычкой …):

 $ ulimit -u 2500 $ ./mypotentiallydeadlyprogram 

Таким образом, я установил ограничение на 2500 процессов для моей текущей оболочки. Благодаря этому, мои вызовы fork заканчиваются неудачей, если они становятся слишком многочисленными, следовательно, предотвращение сбоя системы и позволяя мне яростно ударить Ctrl + C.

На моей машине я нахожу 2500, чтобы быть хорошим пределом, но вы можете увеличить / уменьшить это значение в соответствии с тем, что может взять ваша машина, и как далеко вы хотите, чтобы ваша броская бомба ушла. Также помните, что ваша машина должна порождать вещи, чтобы выжить, не задушив ее. Я видел, как люди пишут это в своих ~/.bashrc , поэтому ограничивают даже основной bash своей сессии. Хотя это было очень забавно для системного администратора, пользователь был очень недоволен замораживанием после входа в систему.

Хотя ulimit можно использовать для настройки временного лимита, вы можете установить что-то более постоянное, если у вас есть root-доступ (и вы хотите установить ограничение для определенных пользователей). Это можно сделать через /etc/security/limits.conf :

 # <domain> <type> <item> <value> youruser soft nproc 2500 youruser hard nproc 2750 

В приведенной выше настройке у youruser есть мягкий предел 2500 процессов (максимум 2750). Этот файл позволяет вам устанавливать различные типы ограничений для различных объектов вашей системы (пользователей, групп и т. Д.). Посмотрите на его документацию, если вам нужна дополнительная информация . Обратите внимание, однако, что это общесистемная конфигурация, что означает, что этот предел не применяется для каждой оболочки для youruser .

Кстати, /proc/sys/kernel/pid_max будет содержать максимальный PID, который может быть предоставлен вашим ядром. Поскольку PID могут использоваться повторно, вы можете считать это действительно близким к максимальному количеству процессов .