【问题标题】:Monitoring Rsync Progress监控 Rsync 进度
【发布时间】:2011-11-01 17:54:30
【问题描述】:

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

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

我为此类消息编写了一个解析器,并使用 to-check 部分生成一个百分比进度,在这里,这将完成 60%。

但是,这里有两个缺陷:

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

我已经查看了要使用的其他消息替代方案,但没有找到任何东西。有人有什么想法吗?

提前致谢!

【问题讨论】:

  • 值跳跃是因为 rsync 在它仍在评估它必须做的工作时开始传输数据。这是一个很好的衡量标准。
  • 有没有办法让它预先评估它需要做的工作? --dry-run --stats 似乎是这样的事情,不幸的是它为要传输的数据产生的值不正确。
  • 为什么要放慢速度,让它显示无用的信息?
  • 嗯,这不是无用的信息...我一次传输千兆字节,重要的是给用户一个有用的进度概念,而不打印消息左、右和中心?在需要半小时的传输上多花一分钟左右,以向用户显示大概需要多长时间,这对我来说似乎是一个合理的权衡。
  • 没有“打印消息左、右和中心”,它只是在了解更多信息时更新进度信息。

标签: python progress rsync


【解决方案1】:

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

来自the man page

还有一个 --info=progress2 选项,它基于整个传输而不是单个文件输出统计信息。使用此标志而不输出文件名(例如,避免使用 -v 或指定 --info=name0 如果您想在不滚动带有很多名称的屏幕的情况下查看传输的情况。(您不需要指定 --进度选项,以便使用 --info=progress2。)

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

【讨论】:

  • 如果我只能在 MinGW 上编译 rsync :/
  • “从rsync 3.0.0 开始,使用的递归算法现在是增量扫描,它使用的内存比以前少得多,并在前几个目录的扫描完成后开始传输。”我的理解是,他们所指的“整个转移”是迄今为止所了解的部分。随着它了解的越多,百分比就会向后跳跃。 --no-inc-recursive 将使其预编译要传输的文件的整个列表。这将使它从一开始就报告正确的百分比。
  • ...但这需要更多内存。更多关于输出here.
【解决方案2】:

请注意这里的警告,即使--info=progress2完全可靠,因为这是基于 rsync 知道进度时的文件数量的百分比正在显示。这不一定是需要同步的文件总数(例如,如果它在深度嵌套的目录中发现大量大文件)。

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

【讨论】:

  • 这对我很有用,感谢您对选项的解释
【解决方案3】:

您可以使用参数--no-inc-recursive 禁用增量递归。 rsync 将对整个目录结构进行预扫描,因此它知道它必须检查的文件总数。

这实际上是它递归的旧方式。为提高速度,添加了当前默认的增量递归。

【讨论】:

    【解决方案4】:

    为了完全控制传输,您应该使用更底层的 diff 工具并自己管理目录列表和数据传输。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多