У меня есть скрипт, который должен периодически запускать программы из массива с именами программ через 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/;
}
}