Это:
if [[ "$OPTARG" -eq 0 ]]
Соответствует любой строке, кроме цифр. Используйте:
if [[ "$OPTARG" == "0" ]]
Вместо этого.
Просто улучшите исходный код вашего приложения (возможно 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, у него есть множество настроек, касающихся его дочерних процессов.