[英]How can I kill a Perl system call after a timeout?
我有一个Perl脚本,我用它来运行一个使用反引号启动的文件处理工具。 问题是,工具偶尔挂起并且需要将其杀死才能处理其余文件。
什么是应用超时的最佳方法,在此之后父脚本将终止挂起的进程?
目前我正在使用:
foreach $file (@FILES) {
$runResult = `mytool $file >> $file.log`;
}
但是当mytool在n秒后挂起时,我希望能够杀死它并继续下一个文件。
我可能不会用``为此。 相反,我会用|
open()
命令 以便它以异步方式运行。 这将返回pid
。 然后你可以在一个带睡眠的循环中进行非阻塞wait()
在经过一定次数的尝试后没有成功,向子pid
发出一个信号。
您需要将$ 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将关闭警报。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.