Захват статуса выхода дочернего процесса отличается в 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, поэтому он не будет изменен на $ ?.

Другие вопросы по тегам