Могу ли я ограничить процесс определенным количеством циклов времени / процессора?

16

У нас есть скрипт, который запускается на наших веб-серверах, запускаемый действиями клиента, который запускает процесс unix для генерации некоторых файлов кэша. Поскольку этот процесс работает с файлами, предоставленными нашим клиентом, он иногда ведет себя неправильно, работает так долго, что процесс PHP, который порождает его время ожидания, или использует столько процессорного времени, что системный администратор убивает его.

Есть ли какая-нибудь команда, которую я мог бы запустить, которая бы ограничивала время процессора / время выполнения процесса? Я ищу команду типа /usr/bin/time, где я мог бы выполнить эту команду и передать ей командную строку, которую я хочу, чтобы она выполнялась и ограничивалась.

мистифицировать
источник

Ответы:

13

В дополнение к ответу Жиля есть инструмент cpulimit , который делает именно то, что вы хотите - включая модификацию во время выполнения. Кроме того, он может ограничиваться только определенными процессорами / ядрами IIRC.

Мацей Печотка
источник
12

Из программы звоните setrlimit(RLIMIT_CPU, ...). Из оболочки вызовите ulimit -t 42(это не стандартно, но поддерживается большинством оболочек (включая bash и ksh) в большинстве вариантов unix). Это приводит к тому, что текущий процесс будет уничтожен после того, как он израсходует N секунд процессорного времени. Ограничение наследуется дочерними процессами. Распространенная идиома оболочки - (ulimit -t 42; runaway_process)если вы хотите иметь возможность впоследствии запускать другие неограниченные процессы из той же оболочки.

См. Также Есть ли способ ограничить объем памяти, который конкретный процесс может использовать в Unix? , Принцип тот же, вы просто ограничиваете другой ресурс.

Жиль "ТАК - перестань быть злым"
источник
Проблема в том, что у меня нет исходного кода для программы, поэтому я не могу добавить его, setrlimitи я порождаю его через PHP, поэтому у меня нет оболочки ...
Джош
6
@Josh: Если вы ищете конструкцию, аналогичную time php /cgi/foo.php, вы можете использовать bash -c 'ulimit -t 42; exec "$0" "$@"' php /cgi/foo.php.
Жиль "ТАК - перестань быть злым"
@ Джош Апач? также я думаю, что этот материал может быть установлен в масштабе всей системы ...
xenoterracide
@xenoterracide да, это Apache, но я хочу ограничить этот процесс, а не все процессы Apache. Gelles 'bash oneliner может отлично работать!
Джош
3

Вы также можете использовать timeoutкоманду, чтобы заблокировать запуск процесса на более длительный период времени.

пример

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

Обратитесь к странице справки по таймауту за дополнительной информацией

SLM
источник