【问题标题】:How to catch timeout exception with IPC::Run on Windows 10?如何在 Windows 10 上使用 IPC::Run 捕获超时异常?
【发布时间】:2021-04-29 19:28:47
【问题描述】:

我正在尝试在 Windows 10 上使用 IPC::Run 捕获超时异常(使用 Strawberry Perl 版本 5.30.1):

use strict;
use warnings;
use feature qw(say);
use Data::Dumper;
use IPC::Run qw(run timeout);

my $timeout = 3;
my $cmd = ['perl', '-E', "sleep 5; say 'stdout_text'; say STDERR 'stderr_text'"];
my $in;
my $out;
my $err;
my $result;
eval {
    $result = run $cmd, \$in, \$out, \$err, timeout($timeout );
};
if ( $@ ) {
    say "Timed out: $@";
}
else {
    print Dumper({  out => $out, err => $err});
}

上述程序在 3 秒后终止:

Terminating on signal SIGBREAK(21)

如何在 Perl 脚本中捕获超时异常?

另请参阅this 问题。

【问题讨论】:

  • 您尝试处理信号了吗?也许像here
  • @zdim 感谢您的链接,是的,它似乎可以与安装的 $SIG{BREAK} 处理程序一起使用!
  • 刚开始尝试一下——我没有收到 SIGBREAK,而是一个实际的异常(像往常一样由 eval 处理)。这是在带有 Strawberry Perl v5.30.2 的 Windows 10(在 VM 中)上; IPC::Run 源显示 $VERSION20200505.0。 (我很困惑?)

标签: windows perl


【解决方案1】:

感谢@zdim!您需要为BREAK 信号安装信号处理程序。以下作品:

use strict;
use warnings;
use feature qw(say);
use Data::Dumper;
use IPC::Run qw(run timeout);

my $timeout = 3;
my $cmd = ['perl', '-E', "sleep 4; say 'stdout_text'; say STDERR 'stderr_text'"];
my $in;
my $out;
my $err;
my $result;
{
    local $SIG{BREAK} = sub { die "Got timeout signal" };
    eval {
        $result = run $cmd, \$in, \$out, \$err, timeout($timeout );
    };
}
if ( $@ ) {
    say "Timed out: $@";
}
else {
    print Dumper({  out => $out, err => $err});
} 

输出

> perl p.pl
Timed out: Got timeout signal at p.pl line 14.

【讨论】:

    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    相关资源
    最近更新 更多