是否有现有的工具可用于通过不良连接下载大文件?
我必须定期下载一个相对较小的文件:300 MB,但缓慢(80-120 KB/秒)的 TCP 连接会在 10-120 秒后随机中断。 (这是一家大公司的网络。我们多次联系他们的管理员(在印度工作),但他们不能或不想做任何事情。)问题可能出在他们的反向代理/负载平衡器上。
到目前为止,我使用的是 pcurl 的修改版本:https://github.com/brunoborges/pcurl
我改变了这一行:
curl -s --range ${START_SEG}-${END_SEG} -o ${FILENAME}.part${i} ${URL} &
对此:
curl -s --retry 9999 --retry-delay 3 --speed-limit 2048 --speed-time 10 \
--retry-max-time 0 -C - --range ${START_SEG}-${END_SEG} -o ${FILENAME}.part${i} ${URL} &
我必须添加,--speed-limit 2048 --speed-time 10
因为连接失败时大多会挂起几分钟。
但最近连这个脚本都无法完成。
一个问题是它似乎忽略了该-C -
部分,因此重试后它不会“继续”该段。它似乎会截断相关的临时文件,并在每次失败后从头开始。 (我认为--range
和-C
选项不能一起使用。)
另一个问题是该脚本同时下载所有段。它不能有 300 个段,其中一次只能下载 10 个。
我正在考虑为此特定目的用 C# 编写一个下载工具,但如果有现有的工具,或者如果 curl 命令可以使用不同的参数正常工作,那么我可以腾出一些时间。
更新 1:附加信息:不应删除并行下载功能,因为它们对每个连接有带宽限制(80-120 KB/秒,主要是 80),因此 10 个连接可以导致 10 倍的加速。我必须在 1 小时内完成文件下载,因为该文件每小时生成一次。
答案1
答案2
我无法在您的情况下为您测试这一点,但您不应该使用--range
with -C -
。以下是手册页关于该主题的内容:
使用
-C -
告诉curl
自动找出在哪里/如何恢复传输。然后它使用给定的输出/输入文件来解决这个问题。
试试这个:
curl -s --retry 9999 --retry-delay 3 --speed-limit 2048 --speed-time 10 \
--retry-max-time 0 -C - -o "${FILENAME}.part${i}" "${URL}" &
我还强烈建议您始终使用双引号引用变量,以便 shell 不会尝试解析它们。 (考虑一个 URL https://example.net/param1=one¶m2=two
,shell 将在其中拆分 处的值&
。)
顺便说一句,120 KB/s 大约为 1.2 Mb/s,这是世界许多地区典型的 xDSL 上传速度。每 MB 需要 10 秒,因此整个文件用时不到一小时。没那么慢,尽管我很欣赏您更关心可靠性而不是速度。
答案3
也许你有更多的运气wget --continue
:
wget --continue ${URL}
也可以看看https://www.cyberciti.biz/tips/wget-resume-broken-download.html
答案4
我在之前的工作中也遇到了同样的问题(除了(在办公室)不稳定的连接上进行 300GB 以上的异地数据库备份)。用户在下载大于大约的文件时遇到严重问题。连接中断前 1 GB。由于他们通过 RDP 连接使用标准 Windows 复制/粘贴文件,这也就不足为奇了。
我发现的一件事是我们的 VPN 设置与网络设置(主要是 MTU 长度)完全不匹配。第二件事是 Windows 的文件复制器不适用于通过 Internet 复制内容。
我的第一个解决方案是一个简单的 FTP 服务器,但是,它没有解决传输时间的问题(我们的连接通常需要 3-4 小时)。
我的第二个解决方案是使用同步事物将文件直接发送到内部 NAS。每天晚上备份完成后,Syncthing 都会将我们需要的所有内容发送回办公室的 NAS。不仅解决了3个多小时传输时间的问题,而且在出现危机时我还节省了1-2个小时来传递数据。每天早上 8 点,NAS 上的文件就会更新,我们的备份也准备好了。即使有巨大的文件(一度接近 700GB 的数据库),我还没有遇到任何文件损坏或其他问题......
Syncthing 非常容易设置和管理,适用于所有平台(甚至是手机),并且能够很好地处理不良连接。如果连接失败,Syncthing 只需等待几分钟并重试即可。
您确实需要一个本地文件夹来同步内容,但您的文件几乎在更新后就可用。
同步的另一个好处是它可以设置为仅同步更改在文件中(例如在差异备份中)...可能会解决部分带宽问题。