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

时间:2020-03-05 18:48:59  来源:igfitidea点击:

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

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

但我担心rsync会取消链接尚未完成下载的源文件。 (我查看了源代码,但没有发现任何防止这种情况的方法。)有什么建议吗?

解决方案

回答

我们对下载过程有多少控制权?如果自己动手,则可以将要下载的文件转到临时目录,也可以使用临时名称,直到完成下载为止,然后在完成后将其转换为正确的名称。如果我们使用的是第三方软件,则我们没有太多控制权,但是我们仍然可以执行temp目录操作。

回答

在我看来,问题在于文件尚未完成传输,而不是我们要删除它。

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

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

怎么办:在speed中将mass挂载为一个远程文件系统(NFS可以工作)。然后,只需直接在网络上抓取文件即可。

回答

Rsync可以排除与某些模式匹配的文件。即使我们不能对其进行修改以使其将文件下载到临时目录,也可能具有在下载过程中对文件进行不同命名的约定(例如:对于名为foo的文件,下载时为foo.downloading),并且我们可以使用此属性从复制中排除仍在下载的文件。

回答

如果我们可以控制爬网过程,或者具有可预测的输出,可以使用上述解决方案(将文件存储在临时文件中,直到完成,然后移动到完成下载的位置,或者忽略名称为" .downloading"的文件)可能会起作用。如果所有这些都不在控制范围内,则可以通过执行'lsof $ filename'并检查是否有结果来确保该文件没有被任何进程打开。显然,如果没有人打开该文件,则将其移动是安全的。