Ich möchte alle Fortschrittsmeldungen erfassen, die von einem rsync-Prozess von einem Perl-Skript ausgegeben werden. Unter bestimmten Umständen funktioniert das nicht.Wie kann ich Rsync-Fortschrittsnachrichten in Perl erfassen?
Hier ist eine typische rsync Befehlszeile Ich verwende:
Building file list ...
1600 files...
1700 files...
and so on
Wenn ich versuche, den gleichen Befehl:
rsync -aL --verbose --progress --bwlimit=100 \
--include-from=/tmp/78hJ2eDCs1 \
--include '*/' --exclude '*' \
/srcdir/* \
hostname:/target/ 2>&1
Wenn ich dies in einer Bash-Shell laufen, ich etwas sehen werde Innerhalb von Perl bekomme ich die Ausgabe der "Dateiliste erstellen" OK, aber nicht die Statusaktualisierungen. Hier ist, wie ich die Capture-Test
my $pid = open(OUTPUT, "$cmd |") or die "Couldn't fork: $!\n";
my $ch;
while(read(OUTPUT, $ch, 1)==1)
{
print $ch;
}
close(OUTPUT);
Meine Vermutung ist, dass entweder rsync den Ausgang Griff spürt ist keine typische Konsole oder ausgegeben in einige ungewöhnliche Art und Weise zu sein, dass ich nicht zu erfassen. Was es jedoch noch seltsamer macht, ist, dass ich, wenn ich die Filter --include und --exclude weglasse, die Statusnachrichten gut erfassen kann.
Wer irgendwelche Hinweise, was vor sich geht?
Nachdem die zwei Antworten bereits zur Verfügung gestellt wurden, vermute ich, dass es etwas ist, das rsync tut, um die Ausgabe zu puffern. Erhalten Sie die gesamte Ausgabe am Ende? –