我有两台机器,速度和质量。 speed具有快速的Internet连接,并且正在运行将大量文件下载到磁盘的爬虫。质量有很多磁盘空间。我想在下载完成后将文件从速度移动到质量。理想情况下,我只是运行:
$ rsync --remove-source-files speed:/var/crawldir .
但我担心rsync会取消尚未完成下载的源文件的链接。 (我查看了源代码,但我没有看到任何可以防止此问题的内容。)有什么建议吗?
答案 0 :(得分:10)
在我看来,问题是在文件完成之前传输,而不是你要删除它。
如果这是Linux,则进程A可以打开文件,进程B可以取消链接文件。没有错误,但当然A浪费时间。因此,rsync删除源文件的事实不是问题。
问题是rsync只有在复制后才删除源文件,如果它仍然被写入磁盘,你将有一个部分文件。
这个怎么样:在mass
中挂载speed
作为远程文件系统(NFS可以工作)。然后直接对文件进行网页抓取。
答案 1 :(得分:8)
您对下载过程有多少控制权?如果您自己滚动,则可以将正在下载的文件转到临时目录或者具有临时名称,直到完成下载,然后在完成后将其命名为正确的名称。如果您正在使用第三方软件,那么您没有那么多控制权,但您仍然可以执行临时目录。
答案 2 :(得分:3)
Rsync可以排除与某些模式匹配的文件。即使您无法修改它以使其下载文件到临时目录,也许它有一个在下载过程中以不同方式命名文件的约定(例如:foo.downloading
在下载名为foo
的文件时并且您可以使用此属性来排除仍在下载的文件。
答案 3 :(得分:3)
如果您可以控制爬网过程,或者它具有可预测的输出,则上述解决方案(存储在临时文件中直到完成,然后进入已完成的下载位置,或忽略具有'.downloading'类型的文件名称)可能会奏效。如果所有这些都超出了您的控制范围,您可以通过执行'lsof $ filename'并检查是否有结果来确保任何进程都不会打开该文件。很明显,如果没有人打开文件,移动它是安全的。