无法处理 perl 中 Psexec 命令的异常处理

Unable to handle exception handling on a Psexec command in perl

如果 psexec 命令失败,或者更重要的是,如果它需要更多时间,我试图退出 for 循环,我在这个程序中使用 Time::Out 模块,但是psexec 命令没有退出,我用错了吗?有没有其他办法可以处理这种情况呢

#$nb_secs means number of seconds
  for my $host1 (@servers){
        timeout $nb_secs => sub {
                 # do stuff that might timeout.
                $returnFileNames=`psexec \\$host1 cmd /c "dir /s 
                 d:\dd\` ;
        }; 

        next if $@;
}

SIGALRM 无法传送到进程的原因有多种,您已经发现了其中之一。解决方法是 poor man's alarm -- 运行 在后台创建一个单独的进程来监视 运行ning 长进程并在一段时间后终止它。在 Windows 上并使用需要捕获输出的命令,它看起来像这样:

# $pid is the id of the process to monitor
my $pid = open my $proc_fh, '-|', "psexec \\$host1 cmd /c "dir /s d:\dd\";

my $pma = "sleep 1,kill(0,$pid)||exit for 1..$nb_secs;"
        . "kill -9,$pid;system 'taskkill /f /pid $pid >nul'";
my $pma_pid = system 1, $^X, "-e", $pma;

# read input from the external process.
my $returnFilenames;
while (<$proc_fh>) {
    $returnFilenames .= $_;
}
close $proc_fh;

穷人的闹钟是一个分为两部分的小程序。第一部分计数到 $nb_secs 秒,如果受监视进程不再 运行ning(如果 kill 0,$pid returns 为假值)则终止。程序的第二部分,如果到达,则终止被监视的进程。在这种情况下,我们尝试两种不同的方式(kill -9 ...system 'taskkill /f ...')来终止进程。