Я хочу захватить все сообщения о прогрессе, генерируемые процессом rsync, из сценария Perl. В определенных обстоятельствах это не работает.
Вот типичная командная строка rsync, которую я использую:
rsync -aL --verbose --progress --bwlimit=100 \
--include-from=/tmp/78hJ2eDCs1 \
--include '*/' --exclude '*' \
/srcdir/* \
hostname:/target/ 2>&1
Если я выполню это в оболочке bash, я увижу что-то вроде этого:
Building file list ...
1600 files...
1700 files...
and so on
Если я попробую ту же команду в Perl, я получу вывод «Список строящихся файлов» в порядке, но не обновлю статус. Вот как я тестирую захват
my $pid = open(OUTPUT, "$cmd |") or die "Couldn't fork: $!\n";
my $ch;
while(read(OUTPUT, $ch, 1)==1)
{
print $ch;
}
close(OUTPUT);
Я предполагаю, что rsync чувствует, что дескриптор вывода не является типичной консолью, или выводится каким-то необычным образом, который я не собираю Однако, что еще более странно, так это то, что если я опущу фильтры --include и --exclude, я смогу перехватить сообщения о состоянии просто отлично.
Кто-нибудь знает, что происходит?