Posso limitare un processo a un determinato periodo di tempo / cicli della CPU?


16

Abbiamo uno script che viene eseguito sui nostri server Web, attivato dall'azione del cliente, che avvia un processo unix per generare alcuni file di cache. Poiché questo processo agisce sui file forniti dal nostro cliente, a volte si comporta in modo anomalo, funzionando così a lungo che il processo PHP che lo genera scade o utilizza così tanto tempo CPU che un amministratore di sistema lo ucciderà.

Esiste un comando che potrei eseguire che limiterebbe il tempo della CPU / tempo di esecuzione del processo? Sto cercando un comando come /usr/bin/time, dove potrei eseguire quel comando e passarlo alla riga di comando che voglio che funzioni e limiti.

Risposte:


13

Oltre alla risposta di Gilles c'è lo strumento cpulimit che fa esattamente quello che vuoi, inclusa la modifica in runtime. Inoltre, può limitare solo a determinate CPU / core IIRC.


12

Dall'interno di un programma, chiama setrlimit(RLIMIT_CPU, ...). Dalla shell, chiama ulimit -t 42(questo non è standard ma supportato dalla maggior parte delle shell (inclusi bash e ksh) sulla maggior parte delle varianti unix). Questo fa sì che il processo corrente venga interrotto dopo aver esaurito N secondi di tempo CPU. La limitazione è ereditata dai processi figlio. Un idioma comune della shell è (ulimit -t 42; runaway_process)se si desidera poter eseguire successivamente altri processi illimitati dalla stessa shell.

Vedi anche C'è un modo per limitare la quantità di memoria che un particolare processo può usare in Unix? . Il principio è lo stesso, stai solo limitando una risorsa diversa.


Il problema è che non ho il codice sorgente del programma, quindi non posso aggiungerlo setrlimite lo sto generando tramite PHP, quindi non ho una shell ...
Josh

6
@Josh: se stai cercando un costrutto analogo a time php /cgi/foo.php, puoi usare bash -c 'ulimit -t 42; exec "$0" "$@"' php /cgi/foo.php.
Gilles 'SO- smetti di essere malvagio' l'

@Josh apache? inoltre penso che questa roba possa essere impostata a livello di sistema ...
xenoterracide,

@xenoterracide sì, è Apache, ma voglio solo limitare questo processo, non tutti i processi Apache. Il bash oneliner di Gilles potrebbe funzionare alla grande!
Josh,

3

È inoltre possibile utilizzare il timeoutcomando per bloccare l'esecuzione di un processo per un periodo di tempo superiore a quello specificato.

esempio

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

Vedere la pagina man del timeout per ulteriori dettagli.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.