Как установить ограничения памяти / ЦП только для разветвленных дочерних процессов, а не для родительского процесса?

Это:

if [[ "$OPTARG" -eq 0 ]] 

Соответствует любой строке, кроме цифр. Используйте:

if [[ "$OPTARG" == "0" ]] 

Вместо этого.

4
15.04.2019, 14:52
1 ответ

Просто улучшите исходный код вашего приложения (возможно Apache2 в вашем случае, который является открытым исходным кодом )для вызова setrlimit (2)после успешного вызова fork (2 ), но перед вызовом execve (2).

Поскольку вы действительно хотите, чтобы системный вызов setrlimitбыл выполнен после ,fork(то, что вы затем установили, остается до следующего вызова setrlimit, возможно, с помощью ulimitвстроенной функции твоя оболочка ).

Потратьте некоторое время, чтобы лучше понять, как системные вызовы (2)работают (в Linux, в частностиforkи execveи setrlimit), и как и когда их следует использовать. Я рекомендую прочитать хорошую книгу по системному программированию Linux, такую ​​как ALP .

Следовательно, то, чего вы хотите достичь, в общем случае нереалистично, если только вы не согласитесь немного изменить каждую используемую вами программу. Философия Unix , вдохновившая разработчиков fork, execve, setrlimit, запрещает это.

Конечно, вы могли бы, в принципе, делать безумныеLD_PRELOADтрюки , чтобы перегрузить поведениеfork(вызова setrlimitпосле того, как он возвращает 0 )илиexecve(вызова setrlimitсистемного вызова перед ним. )для динамически подключаемыхисполняемых файлов(или эквивалентно исправьте собственный вариант libc.so), но это неразумно. См. также файл (1)или ldd (1)для обнаружения таких динамически связанных исполняемых файлов.

Однако вы можете использовать встроенную оболочку ulimit, чтобы установить ограничения для Apache2 и всех его потомков. И вы можете погрузиться в документацию Apache2, у него есть множество настроек, касающихся его дочерних процессов.

4
27.01.2020, 20:55

Теги

Похожие вопросы