Curl

通過不良連接下載大文件

  • March 7, 2018

是否有現成的工具,可用於通過不良連接下載大文件?

我必須定期下載一個相對較小的文件: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 小時內完成文件下載,因為該文件每小時生成一次。

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"'

在你的情況下,我無法為你測試這個,但你不應該使用--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¶m2=two,shell 將在其中拆分值&。)

順便說一句,120 KB/s 大約是 1.2 Mb/s,這是世界許多地方典型的 xDSL 上傳速度。每 MB 10 秒,因此整個文件不到一小時。沒那麼慢,雖然我很欣賞你更關心可靠性而不是速度。

引用自:https://unix.stackexchange.com/questions/428233