我的Perl脚本运行一个外部程序(它接受一个命令行参数)并处理其输出.最初,我这样做:
my @result = `prog arg`;
Run Code Online (Sandbox Code Playgroud)
然而,事实证明该程序是错误的,并且在极少数情况下会无法预测.如果程序在一段时间后没有退出,我怎么能杀掉它呢?该脚本必须在Windows和Linux中都能正常工作,我的理解是警报和分支在Windows中不能正常工作(或根本不能).
我找到了一个名为IPC :: Run的模块,但我无法从文档中弄清楚如何正确使用它.:-(我试过这个:
use strict;
use warnings;
use IPC::Run qw(run timeout);
my $in;
my $out;
my $err;
my @result;
my @cmd = qw(prog arg);
run \@cmd, \$in, \$out, \$err, timeout (10) or die "@cmd: $?";
push @result, $_ while (<$out>);
close $out;
print @result;
Run Code Online (Sandbox Code Playgroud)
作为测试,我创建了一个只能睡60秒的程序,打印出一个字符串stdout并退出.当我尝试使用上面的代码运行它时,它会挂起60秒(而不是10秒,如超时中所指定的)并以奇怪的错误中止:
IPC::Run: timeout on timer #1 at C:/Bin/Unix/Perl/site/lib/IPC/Run.pm line 2956
Run Code Online (Sandbox Code Playgroud)
然后我找到了另一个模块,Proc :: Reliable.从描述来看,它似乎正是我想要的.除了它不起作用!我试过这个:
use strict;
use warnings;
use Proc::Reliable;
my $proc = Proc::Reliable->new …Run Code Online (Sandbox Code Playgroud)