监控Rsync进度

20
我正在尝试编写一个Python脚本,用于监控rsync传输,并提供(粗略的)百分比进度估计。在我的第一次尝试中,我查看了一个rsync --progress命令,并发现它会打印如下信息:

1614 100%    1.54MB/s    0:00:00 (xfer#5, to-check=4/10)

我编写了一个解析器来解析这样的消息,并使用to-check部分来生成百分比进度,这里是60%完成。

但是,这种方法有两个缺陷:

  • 在大型传输中,to-check分数的"分子"似乎不会单调递减,因此百分比完整性可能会向后跳跃。
  • 并非所有文件都会打印此类消息,这意味着进度可能会向前跳跃。

我尝试了其他可用的消息替代方案,但没有找到合适的。请问有什么好的想法吗?

提前致谢!


3
数值跳动是因为rsync在评估尚未完成的任务时就开始传输数据了。这是你能得到的最好的度量标准之一。 - user3850
有没有办法让它预先评估需要完成的工作?--dry-run --stats 似乎是这样做的一种方式,不幸的是,它生成的用于传输数据的值并不正确。 - paulmdavies
为什么要减慢它的速度,只是为了显示无用的信息呢? - user3850
5
嗯,这并不是无用的信息……我一次传输数千兆字节,给用户提供一个有用的进展指示非常重要,而不是到处打印消息。多花一分钟左右的时间来显示用户大致需要多长时间才能完成半小时的传输,对我来说似乎是个合理的权衡。 - paulmdavies
它不会“到处打印消息”,而是随着获取更多信息而更新进度信息。 - user3850
4个回答

30

rsync的最新版本(在编辑时为3.1.2)有一个选项--info=progress2,它将显示整个传输的进度而不是单个文件。

来自man页面

还有一个--info=progress2选项,它基于整个传输输出统计信息,而不是单个文件。如果您想查看传输进度而不用滚动屏幕查看大量文件名,请使用此标志而不输出文件名(例如避免使用-v或指定--info=name0)。 (您不需要指定--progress选项才能使用--info=progress2。)

因此,如果您的系统允许,可以升级rsync到包含该选项的当前版本。


如果我能在MinGW上编译rsync:/ - msiemens
1
rsync 3.0.0开始,现在使用的递归算法是增量扫描,比以前使用的内存少得多,并且在完成了前几个目录的扫描后开始传输。我的理解是,他们所指的“整个传输”是它到目前为止学到的部分。随着它学到更多,百分比会向后跳跃。--no-inc-recursive将使其预编译要传输的所有文件列表。这将使它从一开始就报告正确的百分比。 - x-yuri
但这将需要更多的内存。有关输出的更多信息在此处 - x-yuri

9
您可以使用参数--no-inc-recursive来禁用增量递归。rsync将对整个目录结构进行预扫描,以便知道需要检查的文件总数。
这实际上是它递归的旧方式。为了提高速度,增量递归成为当前默认选项。

7
请注意,即使使用 --info=progress2 ,也并非完全可靠,因为这是基于 rsync 在显示进度时所知道的文件数量的百分比。这未必是需要同步的文件总数(例如,如果它在一个深层嵌套的目录中发现大量大文件)。

确保 --info=progress2 不会在进度指示中“跳回”一种方法是在开始同步之前强制 rsync 递归扫描所有目录(而不是默认行为:增量递归扫描),同时提供 --no-inc-recursive 选项。但请注意,此选项还会增加 rsync 的内存使用量和运行时间。


这对我非常有效,感谢您解释选项。 - the_velour_fog

0

要完全控制传输,您应该使用更低级别的diff工具,并自己管理目录列表和数据传输。

基于librsync有命令行rdiff或python模块pysync可用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接