编写一个中止挂程序的入门程序

时间:2009-06-01 14:45:34

标签: linux perl multithreading

我有一个脚本需要在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/;
  }
}

3 个答案:

答案 0 :(得分:2)

您可以查看Parallel::ForkManager,它可以让您在任何给定时间管理固定数量的子流程。程序名称数组在脚本的生命周期内是保持静态还是连续更新?

内存泄漏听起来很可疑;你有没有对你的脚本进行分析并确定kill / enqueue会导致内存泄漏?

答案 1 :(得分:0)

像这样的管理器进程的替代方案是带有时间戳的PID文件(即内容为pid timestamp),就像sendmail使用的那样。然后你每分钟从cron或其他东西启动一个新进程的副本,如果有一个旧进程,新进程要么死掉(如果时间戳是最近的),要么杀死旧进程(如果时间戳是旧的)

我实际上并不知道为什么你的经理进程必然会导致内存泄漏。你有没有坚定地认识到这种情况?你的理由是什么?

答案 2 :(得分:0)

通常在程序本身而不是追踪程序中使用ALARM信号+自我杀戮。