防止 rsync 删除未完成的源文件

Posted

技术标签:

【中文标题】防止 rsync 删除未完成的源文件【英文标题】:keep rsync from removing unfinished source files 【发布时间】:2010-09-08 02:08:32 【问题描述】:

我有两台机器,速度和质量。 speed 具有快速的 Internet 连接,并且正在运行一个将大量文件下载到磁盘的爬虫。 mass 有很多磁盘空间。我想在下载完成后将文件从速度移动到质量。理想情况下,我会运行:

$ rsync --remove-source-files speed:/var/crawldir .

但我担心 rsync 会取消链接尚未完成下载的源文件。 (我查看了源代码,但没有看到任何保护措施。)有什么建议吗?

【问题讨论】:

【参考方案1】:

在我看来,问题是在文件完成之前传输文件,而不是您要删除它。

如果是 Linux,进程 A 可以打开文件,而进程 B 可以取消链接该文件。没有错误,但是 A 当然是在浪费时间。因此,rsync 删除源文件是没有问题的。

问题是 rsync 仅在复制后才删除源文件,如果它仍在写入磁盘,您将获得部分文件。

怎么样:将mass 挂载为speed 中的远程文件系统(NFS 可以工作)。然后直接对文件进行网络爬取。

【讨论】:

【参考方案2】:

您对下载过程有多少控制权?如果您自己滚动,则可以将正在下载的文件转到临时目录或使用临时名称,直到下载完成,然后在完成下载后将其 mv 到正确的名称。如果您使用的是第三方软件,那么您没有太多的控制权,但您仍然可以执行临时目录的操作。

【讨论】:

【参考方案3】:

Rsync 可以排除匹配某些模式的文件。即使您无法修改它以使其将文件下载到临时目录,也许它在下载过程中具有不同命名文件的约定(例如:foo.downloading 同时下载名为foo 的文件),您可以使用此属性可排除仍在下载的文件,以免被复制。

【讨论】:

【参考方案4】:

如果您可以控制抓取过程,或者它具有可预测的输出,则上述解决方案(存储在临时文件中直到完成,然后移动到已完成的下载位置,或忽略具有“.downloading”类型的文件的名字)可能会工作。如果所有这些都超出了您的控制范围,您可以通过执行 'lsof $filename' 并检查是否有结果来确保文件没有被任何进程打开。显然,如果没有人打开文件,则可以安全地移动它。

【讨论】:

以上是关于防止 rsync 删除未完成的源文件的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 jQuery 悬停事件在未完成时触发?

忽略git中修改(但未提交)的文件?

批量删除本地仓库未下载完成的jar文件

SAP 未完成收货的采购订单如何关闭

删除时间过长且未完成

如何在 iTunes Connect 中删除未完成的应用程序