AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 428233
Accepted
Crouching Kitten
Crouching Kitten
Asked: 2018-03-06 03:50:13 +0800 CST2018-03-06 03:50:13 +0800 CST 2018-03-06 03:50:13 +0800 CST

通过不良连接下载大文件

  • 772

是否有现成的工具,可用于通过不良连接下载大文件?

我必须定期下载一个相对较小的文件: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 Kbytes / sec,主要是 80),因此 10 个连接可以导致 10 倍的加速。我必须在 1 小时内完成文件下载,因为该文件每小时生成一次。

http curl
  • 7 7 个回答
  • 27149 Views

7 个回答

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2018-03-06T06:08:35+08:002018-03-06T06:08:35+08:00

    lftp(维基百科)对此有好处。它支持多种协议,可以使用多个并发并行连接下载文件(在有很多不是由拥塞引起的数据包丢失的情况下很有用),并且可以自动恢复下载。它也是可编写脚本的。

    这里包括您提出的微调(感谢您):

    lftp -c 'set net:idle 10
             set net:max-retries 0
             set net:reconnect-interval-base 3
             set net:reconnect-interval-max 3
             pget -n 10 -c "https://host/file.tar.gz"'
    
    • 39
  2. roaima
    2018-03-06T06:22:39+08:002018-03-06T06:22:39+08:00

    在你的情况下,我无法为你测试这个,但你不应该使用--rangewith -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&param2=two,shell 将在其中拆分值&。)

    顺便说一句,120 KB/s 大约是 1.2 Mb/s,这是世界许多地方典型的 xDSL 上传速度。每 MB 10 秒,因此整个文件不到一小时。没那么慢,虽然我很欣赏你更关心可靠性而不是速度。

    • 13
  3. Alex338207
    2018-03-06T06:04:41+08:002018-03-06T06:04:41+08:00

    也许你有更多的运气wget --continue:

    wget --continue ${URL}
    

    另请参阅https://www.cyberciti.biz/tips/wget-resume-broken-download.html

    • 9
  4. Loren Pechtel
    2018-03-06T20:18:47+08:002018-03-06T20:18:47+08:00

    开箱即用:戴上眼罩并使用 bittorrent。创建 torrent 时使块大小变小。显然,加密文件,这样任何找到种子的人都得不到任何有用的东西。

    • 4
  5. Tylon Foxx
    2018-03-07T01:55:29+08:002018-03-07T01:55:29+08:00

    我在以前的工作中遇到了同样的问题(除了(来自办公室)不稳定连接上的 300GB+ 异地数据库备份)。用户在下载文件时遇到了严重的问题。连接中断前 1 GB。因为他们通过 RDP 连接使用标准的 Windows 复制/粘贴文件,所以难怪。

    我发现的一件事是,我们的 VPN 设置与网络设置(主要是 MTU 长度)完全不匹配。第二件事是 Windows 的文件复制器不是为通过 Internet 复制内容而设计的。

    我的第一个解决方案是一个简单的 FTP 服务器,但是它并没有解决传输时间的问题(我们的连接通常需要 3-4 小时)。

    我的第二个解决方案是使用Syncthing将文件直接发送到内部 NAS。备份完成后的每个晚上,Syncthing 都会将我们需要的所有内容发送回办公室的 NAS。不仅解决了3个多小时的传输时间问题,而且如果出现危机,我可以节省1-2个小时的时间来快递数据。每天早上 8 点,文件将在 NAS 上更新,我们已准备好备份。即使有巨大的文件(曾经有近 700GB 的数据库),我还没有遇到任何文件损坏或其他问题......

    Syncthing 非常易于设置和管理,适用于所有平台(甚至是手机),并且可以很好地处理不良连接。如果连接失败,Syncthing 只需等待几分钟并重试。

    您确实需要一个本地文件夹来同步内容,但您的文件几乎会在更新后立即可用。

    syncthing 的另一个好处是,它可以设置为仅同步文件中的更改(例如在差异备份中)......可能解决您的部分带宽问题。

    • 4
  6. BoredBsee
    2018-03-07T11:39:59+08:002018-03-07T11:39:59+08:00

    您可能会考虑通过糟糕的连接移动文件的老式解决方案 - zmodem。

    这是在人们拿起电话并炸毁连接成为常态的 2400 波特调制解调器时开发的。可能值得一试。

    • 1
  7. Wallace Howery
    2018-03-07T15:27:51+08:002018-03-07T15:27:51+08:00

    您可以尝试使用Kermit:

    Kermit 协议与大多数其他协议的区别在于其广泛的设置允许适应任何两种计算机之间的任何类型和质量的连接——数据包长度、数据包编码、窗口大小、字符集、错误检测方法、超时, 停顿。大多数其他协议设计为仅在某些类型或质量的连接上工作,和/或在某些类型的计算机或类似文件系统之间工作,因此在其他地方工作不佳(或根本不工作)并且几乎没有提供适应计划外的方法- 对于情况。另一方面,Kermit 允许您在任何给定连接上实现成功的文件传输和尽可能高的性能。”

    • 0

相关问题

  • 为什么使用“http-response set-status <not-200>”时haproxy会记录状态码200?

  • 如何卷曲并解压缩到某个目录?[复制]

  • 从终端检查 URL 重定向

  • 从文件中获取 URL 地址并检查 HTTP 代码

  • 如何在终端中下载链接重定向并且似乎仅在 GUI 中工作的文件?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve