2012-07-11 7 views
2

Я запускаю os.system(cmd) в цикле. Поскольку иногда он зависает, я пытаюсь использовать process=subprocess.pOpen(cmd) в цикле for. Но я хочу знать следующее:Подпроцесс обработки python

  • Если я sleep(60), а затем проверить, если процесс все еще работает с помощью process.poll(), как разграничить между процессом фактически работает даже через 1 минуту и ​​процесс, висящий?

  • Если я убью процесс, который висел, будет ли цикл for-прежнему продолжаться или он выйдет?

Спасибо!

ответ

4

Не знаю какого-либо общего способа узнать, висит ли процесс или работает ли он. Если процесс зависает из-за проблемы с блокировкой, тогда он может потреблять 0% CPU, и вы можете угадать, что он висел и не работает; но если он зависает с бесконечным циклом, процесс может сделать CPU на 100% занятым, но не выполнить какую-либо полезную работу. И у вас может быть процесс общения в сети, разговаривающий с очень медленным хостом с длинными таймаутами; который не будет висели, но будет потреблять 0% процессора во время ожидания.

Я думаю, что, в общем, единственная надежда, что у вас есть, - создать какую-то систему «сторожевого пса», где ваш подпроцесс использует межпроцессное общение для периодической отправки сигнала, который означает «Я все еще в живых".

Если вы не можете изменить программу, которую используете в качестве подпроцесса, то, по крайней мере, попытайтесь найти , почему это зависает, и посмотрите, можете ли вы затем выяснить способ догадываться, что он повесил , Возможно, в нем обычно есть сбалансированное сочетание процессора и ввода-вывода, но когда он зависает, он работает в замкнутом бесконечном цикле, а использование процессора идет на 100%; это будет вашей подсказкой, что пришло время убить его и перезапустить. Или, может быть, он записывает в файл журнала каждые 30 секунд, и вы можете контролировать размер файла и перезапускать его, если файл не растет. Или, может быть, вы можете поместить программу в «подробный» режим, когда он печатает сообщения, когда он работает (либо с stdout, либо с stderr), и вы можете посмотреть их. Или, если программа работает как демон, возможно, вы можете активно ее запросить и посмотреть, жива ли она; например, если это база данных, отправьте простой запрос и посмотрите, удастся ли ему это сделать.

Поэтому я не могу дать вам общий ответ, но у меня есть надежда, что вы сможете найти способ обнаружить, когда зависает ваша конкретная программа.

Наконец, наилучшим возможным решением было бы выяснить, почему он висит, и исправить проблему, чтобы этого больше не случилось. Это может быть невозможно, но, по крайней мере, помнить об этом. Вам не нужно обнаруживать, что программа висит, если программа никогда не висит больше!

P.S. Я предлагаю вам выполнить поиск в Google для «как контролировать процесс» и посмотреть, есть ли у вас какие-либо полезные идеи.

0

Общим способом обнаружения остановленных работ является то, что они издавали сигнал примерно через равные промежутки времени, а другой процесс контролировал сигнал. Если монитор видит, что сигнал не поступает после, скажем, в два раза превышающий интервал, он может принять меры, такие как убийство и перезапуск процесса.

Эта общая идея может использоваться не только для программного обеспечения, но и для аппаратного обеспечения. Я использовал его для перезапуска встроенных контроллеров, просто заряжая конденсатор от a.c. связанный сигнал от выходного бита.Простой детектор контролирует конденсатор, и если напряжение когда-либо падает ниже порогового значения, оно просто тянет линию сброса на низком уровне и в то же время удерживает конденсатор в течение достаточно длительного времени, чтобы контроллер перезапустился.

Принцип работы программного обеспечения аналогичен; одним из способов является простое обращение к файлу с интервалами. Монитор проверяет время изменения файла с интервалами и, если он слишком стар, убивает и перезапускает процесс.

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

Смежные вопросы