¿Puedo limitar un proceso a una cierta cantidad de tiempo / ciclos de CPU?

16

Tenemos un script que se ejecuta en nuestros servidores web, desencadenado por la acción del cliente, que inicia un proceso de Unix para generar algunos archivos de caché. Debido a que este proceso actúa sobre los archivos suministrados por nuestro cliente, a veces se comporta mal, se ejecuta tanto tiempo que el proceso de PHP que genera el tiempo de espera o usa tanto tiempo de CPU que un administrador de sistemas lo matará.

¿Hay algún comando que pueda ejecutar que limitaría el tiempo de CPU / tiempo de ejecución del proceso? Estoy buscando un comando como /usr/bin/time, donde podría ejecutar ese comando y pasarle la línea de comando que quiero que se ejecute y limitar.

Josh
fuente

Respuestas:

13

Además de la respuesta de Gilles, hay una herramienta cpulimit que hace exactamente lo que desea, incluida la modificación en tiempo de ejecución. Además, puede limitarse solo a ciertas CPU / núcleos IIRC.

Maciej Piechotka
fuente
12

Desde dentro de un programa, llame setrlimit(RLIMIT_CPU, ...). Desde el shell, llame ulimit -t 42(esto no es estándar, pero es compatible con la mayoría de los shells (incluidos bash y ksh) en la mayoría de las variantes de Unix). Esto hace que el proceso actual se cancele una vez que haya usado N segundos de tiempo de CPU. La limitación es heredada por los procesos secundarios. Un idioma común de shell es (ulimit -t 42; runaway_process)si desea poder ejecutar otros procesos ilimitados después desde el mismo shell.

Consulte también ¿Hay alguna forma de limitar la cantidad de memoria que un proceso en particular puede usar en Unix? . El principio es el mismo, solo estás limitando un recurso diferente.

Gilles 'SO- deja de ser malvado'
fuente
El problema es que no tengo el código fuente del programa, así que no puedo agregarlo setrlimity lo estoy generando a través de PHP para no tener un shell ...
Josh
66
@ Josh: Si estás buscando una construcción análoga a time php /cgi/foo.php, puedes usarla bash -c 'ulimit -t 42; exec "$0" "$@"' php /cgi/foo.php.
Gilles 'SO- deja de ser malvado'
@Josh apache? También creo que esto se puede configurar todo el sistema ...
xenoterracide
@xenoterracide sí, es Apache, pero solo quiero limitar este proceso, no todos los procesos de Apache. ¡Basel oneliner de Gilles puede funcionar muy bien!
Josh
3

También puede usar el timeoutcomando para bloquear la ejecución de un proceso durante más tiempo que el especificado.

ejemplo

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

Consulte la página del manual de tiempo de espera para obtener más detalles.

slm
fuente