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

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

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

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

【问题讨论】:

    标签: storage web-crawler rsync


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-08-10
            • 2013-05-23
            • 2013-06-05
            • 1970-01-01
            • 2016-05-19
            • 1970-01-01
            • 2015-12-04
            • 2019-03-11
            相关资源
            最近更新 更多