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

我有两台机器,速度和质量。Speed 有一个快速的 Internet 连接,并且正在运行一个下载大量文件到磁盘的爬虫程序。巨大的磁盘空间。我想在下载完之后把文件从速度传输到质量。理想情况下,我会逃跑:

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

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

14586 次浏览

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

在我看来,问题是 转移文件还没有完成,而不是你正在删除它。

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

问题是 rsync 只在源文件被复制之后才删除它,如果它仍然被写到磁盘上,那么就会有一个部分文件。

这样如何: 在 speed中将 mass作为远程文件系统挂载(NFS 可以工作)。然后直接在网上抓取文件。

Rsync 可以排除匹配某些模式的文件。即使你不能修改它,使它下载文件到一个临时目录,也许它有一个约定,命名文件不同在下载过程中(例如: foo.downloading而下载的一个文件名为 foo) ,你可以使用这个属性来排除文件仍然在下载从被复制。

如果您可以控制爬行过程,或者它具有可预测的输出,上述解决方案(存储在一个临时文件中直到完成,然后 mv‘ ing 到完成下载的地方,或者忽略文件与’。下载’种类的名称)可能工作。如果所有这些都超出了您的控制范围,您可以通过执行“ lsof$filename”并检查是否有结果来确保文件不被任何进程打开。显然,如果没人打开文件,可以安全地移动它。