如何在Perl中恢复下载?

时间:2010-03-21 12:00:59

标签: perl wget

我有一个项目依赖于在安装时从网上下载的其他二进制文件。为此,我所做的是:

if ( file-present-in-src/)
    # skip that file
else
    # use wget to download the file

这种方法的问题是当我在中间中断下载并且下次调用脚本时,也会跳过部分下载的文件(这是不可取的),我也希望wget继续下载部分下载的文件。

我该怎么办呢: 我能想到的可能的解决方案:

  1. 让文件下载到某个文件说download_tmp。移至原始文件 如果成功的话。
  2. 处理SIG {'INT'}以编写正确的清理代码。
  3. 但这些都无法帮助恢复部分文件下载,

    任何见解?

3 个答案:

答案 0 :(得分:3)

Fist,我不明白这与Perl有什么关系,因为你正在使用wget来进行下载...你可以使用libwww-perl(perldoc LWP)并对下载过程有更多的控制权。

然后我想到下载到“tmp”文件名并成功移动文件。

但是我认为您需要更进一步验证文件的完整性。执行MD5或SHA哈希非常简单,并将下载的哈希与您期望的匹配。您可以在服务器上包含校验和(filename.md5)的短文件。只有在匹配时才确定成功。

请注意,捕获所有信号并且通常试图使进程无法攻击,然后期望它已经工作,这必然会在某个时刻失败。可能存在网络超时,崩溃,电源故障,服务器上的配置问题......您应该假设下载可能会失败,因为它们会进行编码,以便您的进程可以恢复。

最后,您没有告诉我们您正在下载什么类型的二进制文件以及您正在使用它们做什么。因为你使用wget我会假设你在Unix上;你应该考虑使用RPM + Yum或者喜欢的,他们会为你处理这一切。 RPM很容易写,真的。

答案 1 :(得分:1)

使用你的第一种方法..

  1. 下载到“FileName”.tmp
  2. 将“FileName”.tmp移动到“FileName”
    移动!不要复制
  3. 每日一次清理所有.tmp文件(偏执规则)

答案 2 :(得分:1)

您可以使用wget的-N-c选项,并删除整个“if file exists”逻辑。