我正在尝试使用 wget 下载流媒体 mp3。这是我的基本命令:
wget http://sj128.hnux.com/sj128.mp3 -c --timeout=1 --waitretry=0 --tries=0 -O "file.mp3"
我一直在一个脚本中执行此操作(它可以运行 1 小时),但我一直令人气愤地发现我的文件最终会被截断且不完整。例如,我希望文件大约是 30MB,而它只会是 13MB。
直到我直接从 CLI 运行此命令并看到最终我总是遇到“读取超时”时,我才明白发生了什么。这不应该是表演的终结者。-c 和无限重试应该处理这个 FINE。
但相反,在“读取超时”和新的重试之后,即使下载继续,我的文件也会停止增长。
为什么下载继续但文件没有按预期继续增长?我什至创建了一个精心制作的脚本,该脚本以完全不同的文件名启动了一个全新的 wget 以避免“文件”类型的冲突,即使所有输出显示一个完全不同的文件名和一个全新的进程,它仍然没有写新文件!
在这种情况下,为什么似乎开始下载而我的新文件甚至没有出现!?
这是一个实时流。“恢复”的整个概念并不适用,因为既没有开始也没有任何固定的位置可以恢复。您只需获取当前流式传输的任何数据。
但
wget
不知道这一点。网络故障后,恢复尝试如下所示:wget
知道文件有多大。如果服务器支持恢复,wget
会要求它从源文件中间恢复;但是服务器端没有这样的文件,服务器不支持恢复,这种方法失败了。wget
认为它从一开始就收到相同的数据。它会丢弃数据,直到丢弃量达到旧文件大小。然后它开始将新数据附加到文件中。这是您的文件开始增长的时刻。实际上,当连接出现问题时,您不仅会错过流的某些片段;您还会错过本来可以保存的数据,只是因为
wget
假设它第二次收到相同的数据。要克服这个问题,请启动(并在需要时继续重新启动)以下操作:
(如果您愿意,还有其他选项)。收到的任何内容
wget
都将附加到文件中。如果您错过了流的某些片段,则生成的文件显然会存储“切碎”的内容。在我的测试中,VLC 在播放此类文件时没有任何技术问题。注意:您可以随时将文件截断为零大小
: > file.mp3
。即使wget
正在运行,这也会起作用,因为>>
总是寻找给定文件的末尾(请参阅this)。无法重现。我
wget
确实写了一个新文件。在没有更好的事情可做的情况下,我在游戏中花费了我雇主的一点带宽。
您尝试下载的文件超过 230MiB。在我关闭它之前,这就是它之前的样子。
下载在另一端被限制为 15kBps,因此如果您处于“不稳定”连接上,就像看起来一样,那么连接将会断开。
当
wget
尝试恢复时,它只是显示另一端的服务器不支持恢复,因此wget
只是回到开头并重新开始。这是完全预期的行为。从特定条件下的
man
页面。wget
文件不会变大,因为
每次(我猜,30,000MiB / 15kBps)= 半小时(ish)之后,您的连接就会断开
wget
每次连接断开时都必须从文件的开头开始。您的文件管理器只会看到上次使用的最大值并报告该大小,同时wget
从头开始逐步覆盖原始文件,直到您的连接断开......再次......再次......然后......运行
wget
10 秒,停止,然后运行 20 秒。在第二次运行时,一旦下载的大小超过之前,您将看到文件大小再次增加。尽管没有特别记录
-c
(至少我找不到),但在某些条件下会出现这种行为。阅读man wget
关于-nc