我正在将一个 perl 备份脚本从 CentOS 6 改编为 Ubuntu 20.04。
子例程 ExecCmd() 为 rsync 的系统调用启动一个子进程。
在 CentOS 6 上,它使用 rsync 输出填充变量 $ExecCmdOut 并返回退出状态 $pipestatus。
在 Ubuntu 上,$pipestatus 包含 rsync 输出的最后一行。在我看到的日志中
Error (573): rsync failed with status total size is 2,728,691,525 speedup is 509.15.
这是功能。你能看出为什么吗?
sub ExecCmd( \@$ ) {
(my $cmdRef, my $forcelog) = @_;
my @cmd = @$cmdRef;
my $pipestatus='';
die "Fork failed: $!\n" unless defined( my $pid=open(RCHILD, "-|"));
if( $pid ) {
$ExecCmdOut='';
while(<RCHILD>) {
chomp( $_ );
next if $_ eq '';
s/\e\[[0-9\;]+[A-Za-z]//g; # remove ANSI escape sequences
$ExecCmdOut.="$_\n";
$pipestatus=$_;
}
close( RCHILD );
} else {
exec( "@cmd 2>&1; echo \${PIPESTATUS}" ) or die "exec failed: $!\n";
}
$ExecCmdOutout =~ s/$pipestatus\n$//;
$pipestatus = $? if not $pipestatus;
return $pipestatus;
}