Czy mogę ograniczyć proces do określonej liczby cykli czasu / procesora?

16

Mamy skrypt, który działa na naszych serwerach internetowych, uruchamiany przez działania klienta, który inicjuje proces uniksowy w celu wygenerowania niektórych plików pamięci podręcznej. Ponieważ proces ten działa na pliki dostarczone przez naszego klienta, czasami zachowuje się nieprawidłowo, działa tak długo, że proces PHP, który go odradza, przekracza limit czasu lub zużywa tyle czasu procesora, że ​​sysadmin go zabije.

Czy jest jakieś polecenie, które mógłbym uruchomić, które ograniczyłoby czas procesora / czas działania procesu? Szukam polecenia typu /usr/bin/time, w którym mógłbym uruchomić to polecenie i przekazać mu wiersz polecenia Chcę, aby działało i ograniczało.

Josh
źródło

Odpowiedzi:

13

Oprócz odpowiedzi Gillesa istnieje narzędzie cpulimit , które robi dokładnie to, co chcesz - w tym modyfikuje w czasie wykonywania. Dodatkowo może ograniczać się tylko do niektórych procesorów / rdzeni IIRC.

Maciej Piechotka
źródło
12

Z poziomu programu zadzwoń setrlimit(RLIMIT_CPU, ...). Z poziomu powłoki wywołaj ulimit -t 42(nie jest to standard, ale jest obsługiwane przez większość powłok (w tym bash i ksh) w większości wariantów unix). To powoduje, że bieżący proces zostanie zabity, gdy zużyje N sekund czasu procesora. Ograniczenie jest dziedziczone przez procesy potomne. Powszechnym idiomem powłoki jest, (ulimit -t 42; runaway_process)jeśli chcesz mieć możliwość uruchamiania innych nieograniczonych procesów z tej samej powłoki.

Zobacz także Czy istnieje sposób na ograniczenie ilości pamięci, którą dany proces może wykorzystać w Uniksie? . Zasada jest taka sama, po prostu ograniczasz inny zasób.

Gilles „SO- przestań być zły”
źródło
Problem polega na tym, że nie mam kodu źródłowego programu, więc nie mogę go dodać setrlimiti spawnuję go przez PHP, więc nie mam powłoki ...
Josh
6
@Josh: Jeśli szukasz konstrukcji analogicznej do time php /cgi/foo.php, możesz użyć bash -c 'ulimit -t 42; exec "$0" "$@"' php /cgi/foo.php.
Gilles „SO- przestań być zły”
@Josh Apache? też myślę, że te rzeczy można ustawić na cały system ...
Xenoterracide
@ Xenoterracide tak, to Apache, ale chcę tylko ograniczyć ten jeden proces, nie wszystkie procesy Apache. Oneliner Gillesa może działać świetnie!
Josh
3

Możesz także użyć tego timeoutpolecenia, aby zablokować uruchamianie procesu przez czas dłuższy niż określony czas.

przykład

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

Więcej informacji na stronie limitu czasu .

slm
źródło