我有两台机器,一台名为speed,它拥有快速的互联网连接并正在运行一个爬虫程序,将大量文件下载到磁盘上。另一台机器叫mass,它拥有很多磁盘空间。我希望在文件下载完成后将文件从speed移动到mass。理想情况下,我只需要运行:
$ rsync --remove-source-files speed:/var/crawldir .
但我担心rsync会删除一个还没有下载完成的源文件。(我查看了源代码,没有看到任何保护措施。)有什么建议吗?
我有两台机器,一台名为speed,它拥有快速的互联网连接并正在运行一个爬虫程序,将大量文件下载到磁盘上。另一台机器叫mass,它拥有很多磁盘空间。我希望在文件下载完成后将文件从speed移动到mass。理想情况下,我只需要运行:
$ rsync --remove-source-files speed:/var/crawldir .
但我担心rsync会删除一个还没有下载完成的源文件。(我查看了源代码,没有看到任何保护措施。)有什么建议吗?
在我看来,问题似乎是在文件传输未完成前进行删除,而不是你正在删除它。
如果这是Linux系统,那么一个进程(A)正在访问该文件,另一个进程(B)可以将其删除。虽然没有错误发生,但A当然是在浪费时间。因此,rsync删除源文件并不是一个问题。
问题是rsync在复制完后才删除源文件,如果文件仍在磁盘上写入,则可能会得到不完整的文件。
如何?将mass
挂载为远程文件系统(NFS可行)在speed
上使用。然后直接爬取文件。
你对下载过程有多少控制权?如果你自己开发,可以将要下载的文件放到临时目录或者使用临时名称,直到下载完成,然后在下载完成后将其移动到正确的名称。如果你使用第三方软件,则控制权较小,但仍然可能能够使用临时目录。
Rsync可以排除与某些模式匹配的文件。即使您无法修改它以使其将文件下载到临时目录,也可能有一种习惯,在下载期间为命名不同的文件(例如:在名为foo
的文件下载中使用foo.downloading
)并且您可以使用此属性来排除仍在下载的文件从被复制。