避免rsync删除未完成的源文件。

171

我有两台机器,一台名为speed,它拥有快速的互联网连接并正在运行一个爬虫程序,将大量文件下载到磁盘上。另一台机器叫mass,它拥有很多磁盘空间。我希望在文件下载完成后将文件从speed移动到mass。理想情况下,我只需要运行:

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

但我担心rsync会删除一个还没有下载完成的源文件。(我查看了源代码,没有看到任何保护措施。)有什么建议吗?

4个回答

10

在我看来,问题似乎是在文件传输未完成前进行删除,而不是你正在删除它。

如果这是Linux系统,那么一个进程(A)正在访问该文件,另一个进程(B)可以将其删除。虽然没有错误发生,但A当然是在浪费时间。因此,rsync删除源文件并不是一个问题。

问题是rsync在复制完后才删除源文件,如果文件仍在磁盘上写入,则可能会得到不完整的文件。

如何?将mass挂载为远程文件系统(NFS可行)在speed上使用。然后直接爬取文件。


9

你对下载过程有多少控制权?如果你自己开发,可以将要下载的文件放到临时目录或者使用临时名称,直到下载完成,然后在下载完成后将其移动到正确的名称。如果你使用第三方软件,则控制权较小,但仍然可能能够使用临时目录。


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

3

Rsync可以排除与某些模式匹配的文件。即使您无法修改它以使其将文件下载到临时目录,也可能有一种习惯,在下载期间为命名不同的文件(例如:在名为foo的文件下载中使用foo.downloading)并且您可以使用此属性来排除仍在下载的文件从被复制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接