Ограничение процессов до 0,5 с в Bash - PullRequest
1 голос
/ 31 мая 2011

Как я могу ограничить процессы процессором менее 1 с в Bash? Я использую версию 4.1.5 (1), и если я наберу ulimit -t 0.5 command, я получу:

-bash: ulimit: 0.5: invalid number

Я использую ulimit -t 1 command в качестве несовершенного заменителя, но по техническим причинам мне не нужно беспокоить вас, я бы очень хотел, чтобы command был остановлен после того, как у него был процессор в течение полсекунды или может быть немного меньше.

Ответ для конкретного Linux вполне подойдет.

Ответы [ 3 ]

5 голосов
/ 31 мая 2011

Возможно, вы не можете.Базовый системный вызов (setrlimit) обеспечивает разрешение только на целую секунду.

 RLIMIT_CPU
          CPU time limit in seconds.  When the process  reaches  the  soft
          limit, it is sent a SIGXCPU signal.  The default action for this
          signal is to terminate the process.  However, the signal can  be
          caught,  and the handler can return control to the main program.
          If the process continues to consume CPU time, it  will  be  sent
          SIGXCPU  once  per  second  until  the hard limit is reached, at
          which time it is sent SIGKILL.
4 голосов
/ 31 мая 2011

Как говорили другие люди, вы не можете сделать это с помощью стандартных встроенных команд Bash.

Можно создать собственную команду, чтобы ограничить истекшее время для команды (отличное от фактическогоВремя процессора, используемое командой; см. Также комментарии от Rob , за что, спасибо!).Ранее я публиковал на SO код тайм-ауты после целого числа прошедших секунд (поэтому это не является прямым ответом на вашу проблему).Тем не менее, вы могли бы (довольно) легко адаптировать код для использования разрешения менее секунды на истекшее время и возможности POSIX.Основной интерфейс:

timeout -t time [-s signal] cmd [args ...]

Чтобы удовлетворить ваши требования, ему просто нужно будет распознать подсекунду и вызвать соответствующие функции;это влияет на внутренние органы гораздо больше, чем на внешние.

Теоретически (согласно POSIX 2008) вы должны использовать timer_create(), timer_settime() и timer_gettime() функции.Они предоставляют подробный контроль над тем, какой сигнал должен генерироваться по истечении времени таймера и т. Д. Однако не все системы предоставляют их (например, MacOS X 10.6.7 не документирует их).Они используют заголовки <time.h> и <signal.h>, а также struct itimerspecstruct sigevent).

Однако в краткосрочной перспективе вам может понадобиться использовать функции getitimer() и setitimer() вместо этого, который POSIX 2008 помечает как устаревший (но который доступен в MacOS X 10.6.7).В них используются заголовки <sys/time.h> и struct itimerval.

. Для переносимости может потребоваться автоматическая настройка программы, чтобы справиться с обоими из них;Вам также может понадобиться иметь дело с Windows (которая, несомненно, предоставит альтернативный интерфейс).Вы, вероятно, прибегаете к alarm() и временной дискретизации с точностью до секунды, если ни одна из систем таймера сигнализации с высоким разрешением не доступна.Выберите функции timer_* вместо функций *itimer, если они присутствуют, или сначала просто проверьте timer_* и используйте их, если они доступны.

Имейте в виду, что если вы установите тайм-аут на 0,5 секунды с этимифункции, они гарантируют, что минимальное время составляет 0,5 секунды, но оно может быть произвольно больше времени из-за проблем с расписанием.Обратите внимание, что есть timer_getoverrun(), чтобы помочь определить, как долго было превышение.

3 голосов
/ 31 мая 2011

Вы не можете. Базовый вызов setrlimit имеет степень детализации секунд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...