【问题标题】:How can I kill a Perl system call after a timeout?超时后如何终止 Perl 系统调用?
【发布时间】:2010-04-21 00:23:18
【问题描述】:

我有一个 Perl 脚本,用于运行使用反引号启动的文件处理工具。问题是该工具偶尔会挂起,需要将其杀死才能处理其余文件。

在父脚本终止挂起的进程之后应用超时的最佳方式是什么?

目前我正在使用:

foreach $file (@FILES) {
    $runResult = `mytool $file >> $file.log`;
}

但是当 mytool 在 n 秒后挂起时,我希望能够杀死它并继续下一个文件。

【问题讨论】:

标签: perl multithreading


【解决方案1】:

我可能不会为此使用 ``。相反,我会 open() 使用 | 的命令,以便它异步运行。这将返回pid。然后,您可以在睡眠循环中执行非阻塞 wait(),在经过一定次数的尝试未成功后,向子 pid 发出信号。

【讨论】:

    【解决方案2】:

    您需要将 $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 会关闭闹钟。

    【讨论】:

    猜你喜欢
    • 2020-05-22
    • 2011-04-27
    • 2011-09-26
    • 2012-01-17
    • 2013-05-30
    • 2011-02-03
    • 2017-10-10
    • 2018-08-05
    • 2014-08-10
    相关资源
    最近更新 更多