如何在超时后终止Perl系统调用?
我有一个Perl脚本,用于运行使用反引号启动的文件处理工具。问题在于偶尔会出现该工具挂起的情况,并且需要将其杀死才能处理其余文件。如何在超时后终止Perl系统调用?
最好的方式来应用超时之后,父脚本将杀死挂起的过程最好的方式是什么?
在我使用的那一刻:
foreach $file (@FILES) {
$runResult = `mytool $file >> $file.log`;
}
但当mytool n秒后挂断,我想能够杀死它,继续下一个文件。
我可能不会使用``为此。相反,我会open()
命令与|
,以便它异步运行。这将返回pid
。然后你可以做一个非阻塞wait()
与睡眠循环,在一定次数的尝试没有成功后,发出一个信号给孩子pid
。
这样做的伎俩,谢谢。 – Fergal 2010-04-21 02:47:44
您需要将$ 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将关闭闹钟。
相关:http://stackoverflow.com/questions/3967470/how-can-i-specify-timeout-limit-for-perl-system-call/3967987#3967987相同的解决方案,但略有不同的实施,这对我来说更好在“严格使用” – engtech 2011-03-01 20:56:59
相关:http://stackoverflow.com/questions/2562931/how-can-i-terminate-a-system-command-with-alarm-in-perl – mob 2010-04-21 05:48:57