我正在编写一个perl脚本,需要在Windows和Linux中运行,它将运行一个进程,如果时间太长就超时,假设没有超时则返回退出代码,并在假设退出代码为零且未超时的情况下返回stdout。我不需要STDIN或STDERR。我尝试使用IPC::run,但无法使其正常工作。最接近成功的是使用IPC::Open3和waitpid($pid, WNOHANG)。但我遇到了问题。在Windows和Linux上看到了不同的结果。在下面的代码中,我给open3一个将失败的命令(ping没有任何参数“-z”)。在Linux上,代码立即返回负的退出代码。在Windows上,命令会超时。在Windows命令行上运行ping google.com -z会立即返回告诉我没有这样的参数。为什么waitpid返回零?
use strict;
use warnings;
use POSIX ":sys_wait_h";
use IPC::Open3;
my $inFH;
my $outFH;
my @cmd = ("ping", "google.com", "-z");
my $pid = open3( $inFH, $outFH, 0, @cmd);
my $counter=0;
my $waitret;
my $exitcode;
do{
$counter++;
$waitret = waitpid($pid,WNOHANG);
$exitcode = $?;
}while( !$waitret and ($counter < 4_000_000));
if ($counter >= 4_000_000) {
print "Command timed out\n";
kill(9, $pid);
} else {
print "Exit Code: $exitcode\n";
}
欢迎提供其他解决方案。我使用nohang选项的waitpid函数的唯一原因是如果进程运行时间过长,需要杀死该进程。在此期间,我没有其他处理需求。 我使用的是Windows 10 Strawberry Perl 5.28便携版。我的Debian机器上安装了Perl 5.24。