Kann ich einen Prozess auf einen bestimmten Zeitraum / CPU-Zyklus beschränken?

16

Wir haben ein Skript, das auf unseren Webservern ausgeführt wird, ausgelöst durch Kundenaktionen, die einen Unix-Prozess initiieren, um einige Cache-Dateien zu generieren. Da dieser Prozess auf von unseren Kunden gelieferte Dateien wirkt, verhält er sich manchmal so schlecht, dass der PHP-Prozess, der ihn erzeugt, eine Zeitüberschreitung aufweist oder so viel CPU-Zeit verbraucht, dass ein Sysadmin ihn tötet.

Gibt es einen Befehl, den ich ausführen könnte, der die CPU-Zeit / Laufzeit des Prozesses einschränken würde? Ich suche nach einem Befehl wie /usr/bin/time, wo ich diesen Befehl ausführen und die Befehlszeile übergeben kann, die ich ausführen und begrenzen möchte.

Josh
quelle

Antworten:

13

Neben Gilles answer gibt es das Tool cpulimit , das genau das tut, was Sie wollen - einschließlich der Änderung in der Laufzeit. Außerdem kann es nur auf bestimmte CPUs / Cores IIRC beschränkt werden.

Maciej Piechotka
quelle
12

Rufen Sie in einem Programm auf setrlimit(RLIMIT_CPU, ...). Rufen Sie in der Shell auf ulimit -t 42(dies ist kein Standard, wird aber von den meisten Shells (einschließlich bash und ksh) auf den meisten Unix-Varianten unterstützt). Dies führt dazu, dass der aktuelle Prozess abgebrochen wird, sobald N Sekunden CPU-Zeit verbraucht sind. Die Einschränkung wird von untergeordneten Prozessen übernommen. Ein gängiges Shell-Idiom ist, (ulimit -t 42; runaway_process)wenn Sie in der Lage sein möchten, anschließend andere unbegrenzte Prozesse von derselben Shell aus auszuführen.

Siehe auch Gibt es eine Möglichkeit, die Speichermenge zu begrenzen, die ein bestimmter Prozess in Unix verwenden kann? . Das Prinzip ist dasselbe, Sie beschränken lediglich eine andere Ressource.

Gilles 'SO - hör auf böse zu sein'
quelle
Das Problem ist, dass ich nicht den Quellcode für das Programm habe, also kann ich ihn nicht hinzufügen setrlimitund ich spawne ihn über PHP, also habe ich keine Shell ...
Josh
6
@Josh: Wenn Sie nach einem Konstrukt suchen, das analog zu ist time php /cgi/foo.php, können Sie es verwenden bash -c 'ulimit -t 42; exec "$0" "$@"' php /cgi/foo.php.
Gilles 'SO- hör auf böse zu sein'
@ Josh Apache? Ich denke auch, dass dieses Zeug systemweit eingestellt werden kann ...
Xenoterracide
@xenoterracide Ja, es ist Apache, aber ich möchte nur diesen einen Prozess einschränken, nicht alle Apache-Prozesse. Gilles 'Bash-Oneliner könnte großartig funktionieren!
Josh
3

Sie können den timeoutBefehl auch verwenden, um zu verhindern, dass ein Prozess länger als eine bestimmte Zeit ausgeführt wird.

Beispiel

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

Weitere Informationen finden Sie in der Manpage zur Zeitüberschreitung .

slm
quelle