Posso limitar um processo a uma certa quantidade de tempo / ciclos de CPU?

16

Temos um script que roda em nossos servidores da web, acionado pela ação do cliente, que inicia um processo unix para gerar alguns arquivos de cache. Como esse processo atua sobre os arquivos fornecidos pelo cliente, às vezes se comporta mal, executando tanto tempo que o processo PHP que o gera atinge o tempo limite ou usa tanto tempo de CPU que um administrador de sistemas o mata.

Existe algum comando que eu possa executar que limite o tempo / tempo de execução da CPU do processo? Estou procurando um comando como /usr/bin/time, onde eu poderia executar esse comando e passá-lo à linha de comando que eu quero que ele execute e limite.

Josh
fonte

Respostas:

13

Além de resposta Gilles há cpulimit ferramenta que faz exatamente o que você quer - incluindo modifing em tempo de execução. Além disso, pode limitar a apenas determinadas CPUs / Cores IIRC.

Maciej Piechotka
fonte
12

De dentro de um programa, ligue setrlimit(RLIMIT_CPU, ...). No shell, chame ulimit -t 42(isso não é padrão, mas é suportado pela maioria dos shells (incluindo bash e ksh) na maioria das variantes unix). Isso faz com que o processo atual seja interrompido depois de consumir N segundos de tempo da CPU. A limitação é herdada pelos processos filho. Um idioma comum do shell é (ulimit -t 42; runaway_process)se você quiser executar outros processos ilimitados posteriormente a partir do mesmo shell.

Consulte também Existe uma maneira de limitar a quantidade de memória que um processo específico pode usar no Unix? . O princípio é o mesmo, você está apenas limitando um recurso diferente.

Gilles 'SO- parar de ser mau'
fonte
O problema é, eu não tenho o código fonte para o programa, então não posso adicionar setrlimite estou gerando-lo através de PHP, então eu não tenho um shell ...
Josh
6
@ Josh: Se você está procurando uma construção análoga time php /cgi/foo.php, pode usar bash -c 'ulimit -t 42; exec "$0" "$@"' php /cgi/foo.php.
Gilles 'SO- stop be evil'
@Josh apache? Também acho que este material pode ser sistema de jogo grande ...
xenoterracide
@xenoterracide sim, é o Apache, mas eu só quero limitar esse processo, nem todos os processos do apache. O oneliner do bash de Gilles pode funcionar muito bem!
21710 Josh
3

Você também pode usar o timeoutcomando para impedir a execução de um processo por mais de um período especificado.

exemplo

$ date
Mon May  6 07:35:07 EDT 2013
$ timeout 5 sleep 100
$ date
Mon May  6 07:35:14 EDT 2013

Consulte a página do manual timeout para obter mais detalhes.

slm
fonte