Захват статуса выхода дочернего процесса отличается в CentOS 6 и Ubuntu 20.04 (на Perl)?
Я адаптирую сценарий резервного копирования Perl из CentOS 6 в Ubuntu 20.04.
Подпрограмма ExecCmd() запускает дочерний процесс для системного вызова rsync.
В CentOS 6 он заполняет переменную $ExecCmdOut выводом rsync и возвращает статус выхода, $ 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;
}
1 ответ
Здесь вы заполняете $ pipestatus текущей строкой:
$pipestatus=$_;
В конце вы устанавливаете его на $? только когда $ pipestatus ложно. Если он содержит последнюю строку, это не false, поэтому он не будет изменен на $ ?.