2010-04-21 62 views
3

我有一个Perl脚本,用于运行使用反引号启动的文件处理工具。问题在于偶尔会出现该工具挂起的情况,并且需要将其杀死才能处理其余文件。如何在超时后终止Perl系统调用?

最好的方式来应用超时之后,父脚本将杀死挂起的过程最好的方式是什么?

在我使用的那一刻:

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

但当mytool n秒后挂断,我想能够杀死它,继续下一个文件。

+0

相关:http://stackoverflow.com/questions/2562931/how-can-i-terminate-a-system-command-with-alarm-in-perl – mob 2010-04-21 05:48:57

回答

6

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

+0

这样做的伎俩,谢谢。 – Fergal 2010-04-21 02:47:44

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将关闭闹钟。

+0

相关:http://stackoverflow.com/questions/3967470/how-can-i-specify-timeout-limit-for-perl-system-call/3967987#3967987相同的解决方案,但略有不同的实施,这对我来说更好在“严格使用” – engtech 2011-03-01 20:56:59

相关问题