Linux, тайм-аут на подпроцесс - PullRequest
4 голосов
/ 30 августа 2011

Хорошо, мне нужно написать код, который вызывает сценарий, и если операция в сценарии зависает, завершает процесс.

Предпочтительным языком является Python, но я также просматриваю C и bashДокументация сценария тоже.

Кажется, что это простая проблема, но я не могу выбрать лучшее решение.

Из исследований до сих пор:

  • Python: Имееткакая-то странная модель потоков, где виртуальная машина использует один поток за раз, не будет работать?
  • C: Предполагается, что предпочтительное решение до сих пор использует SIGALARM + fork + execl.Но SIGALARM небезопасен, так что он может уничтожить все?
  • Bash: программа тайм-аута?Не стандартно для всех дистрибутивов?

Поскольку я новичок в Linux, я, вероятно, не знаю о 500 различных проблемах с этими функциями, поэтому кто-нибудь может сказать мне, какой самый безопасный и чистый способ?1017 *

Ответы [ 3 ]

4 голосов
/ 30 августа 2011

Избегайте SIGALRM, потому что внутри обработчика сигнала не так много безопасных вещей.

Учитывая системные вызовы, которые вы должны использовать, в C после выполнения fork-exec для запуска подпроцесса вы можете периодически вызывать waitpid(2) с опцией WNOHANG, чтобы проверить, является ли подпроцесс все еще работает. Если waitpid возвращает 0 (процесс все еще выполняется) и истекло желаемое время ожидания, вы можете kill(2) подпроцесс.

2 голосов
/ 31 августа 2011

В bash вы можете сделать что-то похожее на это:

  1. запустить скрипт / программу в фоновом режиме с помощью &
  2. получить идентификатор процесса фонового процесса
  3. спи какое-то время
  4. , а затем завершите процесс (если он завершен, вы не можете уничтожить его), или вы можете проверить, является ли процесс еще живым, а затем убить его.

Пример:

sh long_time_script.sh &
pid=$!
sleep 30s
kill $pid

Вы можете даже попытаться использовать trap 'script_stopped $pid' SIGCHLD - смотрите bash man для получения дополнительной информации.

ОБНОВЛЕНИЕ: я нашел другую команду timeout . Он делает именно то, что вам нужно - запускает команду с ограничением по времени. Пример: * +1021 *

timeout 10s sleep 15s

убьет sleep через 10 секунд.

1 голос
/ 31 августа 2011

Существует коллекция кода Python, в которой есть функции, позволяющие сделать это, и без особых трудностей, если вы знаете API.

Коллекция Pycopia имеет модуль планировщика для функций тайм-аута и модуль proctools для порождения подпроцессов и отправки на него сигналов.В этом случае можно использовать метод kill.

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