我有一个Perl脚本,用于运行使用反引号启动的文件处理工具。问题是该工具偶尔会挂起并且需要将其杀死才能处理其余文件。
什么是应用超时的最佳方法,在此之后父脚本将终止挂起的进程?
目前我正在使用:
foreach $file (@FILES) {
$runResult = `mytool $file >> $file.log`;
}
但是当mytool在n秒后挂起时,我希望能够杀死它并继续下一个文件。
答案 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会关闭闹钟。