在Windows平台上,从perl运行gradle并超时的最佳方法是什么?

在Windows平台上,从perl运行gradle并超时的最佳方法是什么?,perl,gradle,timeout,Perl,Gradle,Timeout,我正在教一堂高中计算机科学课,我正试图根据我所有的学生提交的资料自动执行JUnit测试。我使用perl脚本包装器克隆学生存储库,并最初使用系统(“gradle测试”)在每个存储库中运行测试 我发现我需要添加一个超时机制,因为我的许多学生在他们的代码中创建了循环,所以我切换到使用IPC::Cmd,如下所示: $cmd = "gradle test"; my ($success, $error, $full_buf,$stdout_buf,$stderr_buf) =

我正在教一堂高中计算机科学课,我正试图根据我所有的学生提交的资料自动执行JUnit测试。我使用perl脚本包装器克隆学生存储库,并最初使用系统(“gradle测试”)在每个存储库中运行测试

我发现我需要添加一个超时机制,因为我的许多学生在他们的代码中创建了循环,所以我切换到使用IPC::Cmd,如下所示:

$cmd = "gradle test";
my ($success, $error, $full_buf,$stdout_buf,$stderr_buf) = 
     run (command =>$cmd, verbose => 1, timeout => 20);
这在Mac上非常有效,但在Windows上,我从gradle那里得到以下错误: 无法确定Stdout是否为控制台:无法获取句柄文件信息(错误号1)

我已经尝试重定向stdout和stderr,但是对于stdin它失败了。。。 任何想法都将不胜感激

无法确定Stdout是否为控制台

当我用下面的
Perl
脚本替换您的
$cmd=“gradle test”
时,我无法重现该错误(Windows 10,草莓Perl版本5.30.1)。但是,超时没有按预期工作。以下是我的简单测试程序:

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

my $timeout = shift @ARGV;
#my $cmd = ['perl', '-E', "sleep 4; exit 1"];
my $cmd = ['perl', '-E', "sleep 4; say 'stdout_text'; say STDERR 'stderr_text'"];
my ($success, $error, $full_buf,$stdout,$stderr) = 
     run (command =>$cmd, verbose => 1, timeout => $timeout);
say "success = $success" if $success;
say "error = $error" if $error;
print Dumper({ stdout => $stdout, stderr => $stderr});
如果我在超时为1的情况下运行此操作,则

> perl p.pl 1
Running [perl -E sleep 4; say 'stdout_text'; say STDERR 'stderr_text']...
stderr_text
stdout_text
error = IPC::Cmd::TimeOut: Command 'perl -E sleep 4; say 'stdout_text'; say STDERR 'stderr_text'' aborted by alarm after 1 seconds
$VAR1 = {
          'stdout' => [
                        'stdout_text
'
                      ],
          'stderr' => [
                        'stderr_text',
                        '
'
                      ]
        };

因此,即使它报告说它在一秒钟后超时,它实际上还是将程序运行到最后。我正在研究这个问题。

你能试着用IPC::Cmd代替前面提到的
IPC::Cmd吗?谢谢你的建议,我会试试的。我正在运行ActivePerl 5.28-我忘了把它放在原始问题中。我可以通过为stdin创建一个空文件,并将stdout和stderr重定向到一个文件来运行它,但是我遇到了同样的问题,超时没有触发。。。。我将尝试IPC::Run,而不是…转换为IPC::Run会实现我想要的功能!。。。非常感谢。