如何在超时后终止Perl系统调用?

时间:2010-04-21 00:23:19

标签: perl multithreading

我有一个Perl脚本,用于运行使用反引号启动的文件处理工具。问题是该工具偶尔会挂起并且需要将其杀死才能处理其余文件。

什么是应用超时的最佳方法,在此之后父脚本将终止挂起的进程?

目前我正在使用:

foreach $file (@FILES) {
    $runResult = `mytool $file >> $file.log`;
}

但是当mytool在n秒后挂起时,我希望能够杀死它并继续下一个文件。

2 个答案:

答案 0 :(得分:6)

我可能不会为此使用``。相反,我会open()使用|命令,以便它以异步方式运行。这将返回pid。然后,你可以在一个有睡眠的循环中进行非阻塞wait(),在经过一定次数的尝试后没有成功,向孩子发出信号pid

答案 1 :(得分:3)

您需要将$ SIG {'ALRM'}设置为处理程序例程,然后使用超时值调用警报函数。类似的东西:

$SIG{'ALRM'} = handler;
foreach $file (@FILES) {
  alarm(10);
  $runResult = `mytool $file >> $file.log`;
  alarm(0);
}

sub handler {
  print "There was a timeout\n";
}

这应该在10秒后触发处理程序子程序。将闹钟设置为0会关闭闹钟。