繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM