防止 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 删除未完成的源文件的主要内容,如果未能解决你的问题,请参考以下文章