Написание стартовой программы, которая прерывает зависание программ - PullRequest
2 голосов
/ 01 июня 2009

У меня есть скрипт, который должен периодически запускать программы из массива с именами программ через Perl в Linux. Проблема в том, что время от времени одна из программ занимает слишком много времени / зависает и должна быть прервана.

В настоящее время я запускаю программу, используя qx/$cmd/ в отдельном потоке, который читает из общей очереди запуска. Основной поток каждые x секунд помещает новый элемент в очередь. Если в очереди есть элементы, основной поток убивает дочерний поток и запускает новый дочерний.

Это нормально работает с функциональной точки зрения, но теперь я понял, что это приводит к утечке памяти. Как бы вы разработали такую ​​программу? Есть ли модуль CPAN, который может помочь? Пожалуйста, дайте мне знать, если вам нужен дополнительный код для понимания проблемы.

Основная тема выглядит так:

     if (!$startQueue->pending) {
   $startQueue->enqueue($programList[$i++]);
 } else {
   $log->warn("Aborting hanging execution");
   $starterThread->kill('KILL')->detach();
   $log->info("Creating new thread");
   $starterThread=threads->create("starterThread");
 }

Дочерняя нить выглядит так:

sub starterThread{
  $SIG{'KILL'}=sub{threads->exit();};
  $log->info("Starter Thread started");
  while() {
    my $programName=$startQueue->dequeue();
    $log->debug("programName:$programName");
    qx/$programName/;
  }
}

Ответы [ 3 ]

2 голосов
/ 01 июня 2009

Вы можете взглянуть на Parallel :: ForkManager , который позволяет вам управлять фиксированным количеством дочерних процессов в любой момент времени. Массив имени программы остается неизменным в течение всего жизненного цикла сценария или постоянно обновляется?

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

0 голосов
/ 01 июня 2009

Обычно используют сигнал ALARM + самоубийство внутри самой программы, а не программы-преследователя.

0 голосов
/ 01 июня 2009

Альтернативой процессу менеджера, подобному этому, является PID-файл с отметкой времени (т.е. содержимое pid timestamp), как в случае использования sendmail. Затем вы запускаете новую копию процесса каждую минуту из cron или чего-то еще, и, если существует старый процесс, новый процесс либо умирает (если временная метка недавняя), либо убивает старый процесс (если временная метка старая) .

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

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