我想从 Perl 脚本中捕获 rsync 进程发出的所有进度消息。在某些情况下,这不起作用。
这是我使用的典型 rsync 命令行:
rsync -aL --verbose --progress --bwlimit=100 \
--include-from=/tmp/78hJ2eDCs1 \
--include '*/' --exclude '*' \
/srcdir/* \
hostname:/target/ 2>&1
如果我在 bash shell 中运行它,我会看到如下内容:
Building file list ...
1600 files...
1700 files...
and so on
如果我在 Perl 中尝试相同的命令,我会得到“构建文件列表”输出 OK,但不是状态更新。这是我测试捕获的方法
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 过滤器,我可以很好地捕获状态消息。
有人知道发生了什么吗?