我有一个脚本需要在Linux上通过Perl定期从程序名称中启动程序。问题是,其中一个程序需要花费太长时间/挂起并需要中止。
目前,我在一个单独的线程中使用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/;
}
}
答案 0 :(得分:2)
您可以查看Parallel::ForkManager,它可以让您在任何给定时间管理固定数量的子流程。程序名称数组在脚本的生命周期内是保持静态还是连续更新?
内存泄漏听起来很可疑;你有没有对你的脚本进行分析并确定kill / enqueue会导致内存泄漏?
答案 1 :(得分:0)
像这样的管理器进程的替代方案是带有时间戳的PID文件(即内容为pid
timestamp
),就像sendmail使用的那样。然后你每分钟从cron或其他东西启动一个新进程的副本,如果有一个旧进程,新进程要么死掉(如果时间戳是最近的),要么杀死旧进程(如果时间戳是旧的)
我实际上并不知道为什么你的经理进程必然会导致内存泄漏。你有没有坚定地认识到这种情况?你的理由是什么?
答案 2 :(得分:0)
通常在程序本身而不是追踪程序中使用ALARM信号+自我杀戮。