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

3
我有一个Perl脚本,用于运行一个文件处理工具,该工具是使用反引号启动的。问题是,有时候这个工具会挂起,需要杀死它才能继续处理其余的文件。
最好的方法是在一段时间后应用超时,之后父进程将杀死挂起的进程?
目前我正在使用:
foreach $file (@FILES) {
    $runResult = `mytool $file >> $file.log`;
}

但是当我的工具在n秒后挂起,我希望能够杀死它并继续处理下一个文件。


相关链接:https://dev59.com/K0zSa4cB1Zd3GeqPq_Am - mob
2个回答

6

对于这个问题,我可能不会使用``。相反,我会使用|打开命令,以便它异步运行。这将返回pid。然后你可以在循环中使用非阻塞的wait()和睡眠,在一定次数的尝试失败后向子进程pid发出信号。


3

您需要将$SIG {'ALRM'}设置为处理程序,并使用超时值调用alarm函数。类似这样:

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


相关链接:https://dev59.com/cG865IYBdhLWcg3wIrBg#3967987。同样的解决方案,但在“use strict”下对我更有效的实现略有不同。 - engtech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接