Os arquivos limits são utilizados por PAM . O estoque suexec fornecido pelo apache ainda não reconhece ou utiliza PAM . Existem patches. E você pode modificar a fonte diretamente para invocar setrlimit (parece bem fácil - veja a página setlimit(2) man.) Mas como está, suexec não reconhecerá nada que você fizer com limits .
Você ainda pode configurar ulimits de dentro do apache, mas acho que isso é indesejável, especialmente no modelo de pré-fork, porque então você limita a carga que seu servidor http pode manipular. Além disso, não tenho certeza se os limites serão transferidos para o ambiente suexec porque não sei como suexec faz seu trabalho.
O motivo CPUShares não o ajudará aqui é porque a sua fork é um "resource hog", mas os recursos não estão realmente nos ciclos da CPU. Quando a contabilização da CPU se torna envolvida, é tarde demais: o sistema não tem memória livre ou slots de processo para tentar executar o programa.
Você pode experimentar prlimit , parte de util-linux , por isso deve ser padrão em sua instalação. Se você fizer isso:
$ prlimit --nproc=1 bash -c bash -c id
bash: fork: retry: No child processes
Portanto, o pequeno processo de 2-fork falhou.
Infelizmente, não vejo uma boa maneira de se envolver na cadeia de execução. O Apache se autocentrou e a todos nós, fornecendo um módulo suexec reprovado que não é flexível o suficiente para atender à demanda básica, e é simples o suficiente para que qualquer solução real exija um buraco na segurança.