无法处理 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 ...'
)来终止进程。
如果 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 ...'
)来终止进程。