169

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

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

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

4

4 回答 4

10

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

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

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

这个怎么样:massspeed. 然后直接对文件进行网络抓取。

于 2008-09-07T15:16:34.683 回答
9

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

于 2008-09-07T15:03:16.447 回答
3

Rsync can exclude files matching certain patters. Even if you can't modify it to make it download files to a temporary directory, maybe it has a convention of naming the files differently during download (for example: foo.downloading while downloading for a file named foo) and you can use this property to exclude files which are still being downloaded from being copied.

于 2008-09-07T18:05:25.900 回答
3

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

于 2008-09-18T14:53:24.910 回答