Puis-je limiter un processus à un certain nombre de cycles de temps / CPU?

16

Nous avons un script qui s'exécute sur nos serveurs Web, déclenché par l'action du client, qui initie un processus Unix pour générer des fichiers de cache. Parce que ce processus agit sur les fichiers fournis par notre client, il se comporte parfois mal, s'exécutant si longtemps que le processus PHP qui le génère expire ou utilise tellement de temps CPU qu'un administrateur système le tuera.

Y a-t-il une commande que je pourrais exécuter qui limiterait le temps CPU / runtime du processus? Je cherche une commande comme /usr/bin/time, où je pourrais exécuter cette commande et lui passer la ligne de commande que je veux qu'elle exécute et limite.

Josh
la source

Réponses:

13

En plus de la réponse de Gilles, il existe un outil cpulimit qui fait exactement ce que vous voulez - y compris la modification en runtime. De plus, il peut limiter à certains processeurs / cœurs IIRC seulement.

Maciej Piechotka
la source
12

À partir d'un programme, appelez setrlimit(RLIMIT_CPU, ...). Depuis le shell, appelez ulimit -t 42(ce n'est pas standard mais pris en charge par la plupart des shells (y compris bash et ksh) sur la plupart des variantes Unix). Cela provoque l'arrêt du processus en cours une fois qu'il a utilisé N secondes de temps CPU. La limitation est héritée par les processus enfants. Un idiome de shell commun est (ulimit -t 42; runaway_process)si vous voulez pouvoir exécuter ensuite d'autres processus illimités à partir du même shell.

Voir aussi Existe-t-il un moyen de limiter la quantité de mémoire qu'un processus particulier peut utiliser sous Unix? . Le principe est le même, vous limitez simplement une ressource différente.

Gilles 'SO- arrête d'être méchant'
la source
Le problème est que je n'ai pas le code source du programme, donc je ne peux pas l'ajouter setrlimitet je le génère via PHP, donc je n'ai pas de shell ...
Josh
6
@Josh: Si vous recherchez une construction analogue à time php /cgi/foo.php, vous pouvez l'utiliser bash -c 'ulimit -t 42; exec "$0" "$@"' php /cgi/foo.php.
Gilles 'SO- arrête d'être méchant'
@Josh apache? aussi je pense que ce truc peut être réglé à l'échelle du système ...
xenoterracide
@xenoterracide oui c'est Apache, mais je veux seulement limiter ce seul processus, pas tous les processus apache. Le bash oneliner de Gilles peut très bien fonctionner!
Josh
3

Vous pouvez également utiliser la timeoutcommande pour empêcher un processus de s'exécuter plus longtemps qu'une durée spécifiée.

exemple

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

Reportez-vous à la page de manuel du délai d'expiration pour plus de détails.

slm
la source