![WGET:是否可以自动恢复 HTTP URL 的下载?](https://linux22.com/image/1557623/WGET%EF%BC%9A%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E8%87%AA%E5%8A%A8%E6%81%A2%E5%A4%8D%20HTTP%20URL%20%E7%9A%84%E4%B8%8B%E8%BD%BD%EF%BC%9F.png)
我使用 cron 任务来执行 shell 脚本,这些脚本只是对 wget 的简单调用。下面是一个例子:
#!/bin/sh
fileName="WRTI-"$(date +"%m-%d-%Y-%H%M")
directory=/volume1/multimedia/Internet\ Radio\ Recordings/WRTI/$1/
wget http://playerservices.streamtheworld.com/api/livestream-redirect/WRTI_JAZZ.mp3 -O "$directory$fileName.mp3" -q&
nWgetPID=$!
sleep 3600
kill $nWgetPID
echo "Done."
这是互联网广播流。我的问题是,虽然它工作正常,但有时流会“中断”(据我所知),最终流会被截断。如果我可以在 WGET 上设置一个开关,让它说“中断后自动恢复”,我会非常非常非常(非常非常)高兴。
有任何想法吗?
答案1
正如 C0deDaedalus 所写,wget -c
意思是通过发送“Range”标头来恢复下载部分下载的文件。由于您正在处理实时互联网流,因此此标志不会按预期工作。充其量,它可能使您能够继续将流附加到同一个下载文件中,而忽略流中断时丢失块的事实,并且充其量,丢失的块不会给您的 MP3 播放器带来麻烦。
无论如何,你似乎也遇到了不同的问题:你的脚本实际上需要探测当该wget
过程过早结束时,它甚至可以尝试恢复下载。 这是一种检测进程是否已结束的方法,使用 的退出状态kill -0
。 这意味着你不能只使用sleep 3600
其中任何一个,所以你需要一小时后以不同的方式结束. 因此,您将得到如下结果:
#!/usr/bin/bash
directory=/volume1/multimedia/Internet\ Radio\ Recordings/WRTI/$1/
endSeconds=$((SECONDS + 3600))
while [ $SECONDS -lt $endSeconds ]; do
fileName="WRTI-"$(date +"%m-%d-%Y-%H%M%S")
wget http://playerservices.streamtheworld.com/api/livestream-redirect/WRTI_JAZZ.mp3 -O "$directory$fileName.mp3" -q&
nWgetPID=$!
while kill -0 "$nWgetPID" >/dev/null 2>&1; do
if [ $SECONDS -gt $endSeconds ]
then
kill "$nWgetPID"
fi
sleep 1
done
done
echo "Done."
如上所述,每次中断后都会启动一个新文件。您也可以将wget -c
所有内容合并到同一个文件中,但这样您将无法轻松诊断有多少次中断以及它们何时发生。
答案2
好吧,要继续中断的下载,wget
您可以使用-c
表示继续的选项。
wget -c http://playerservices.streamtheworld.com/api/livestream-redirect/WRTI_JAZZ.mp3 -O "$directory$fileName.mp3" -q
这里有一些要点:
- 它假定您在本地系统上已部分下载文件。
- 如果先前调用的下载文件为空,它将拒绝继续。在这种情况下,您需要先删除空文件。
使用时
-c
,服务器上任何大于本地的文件都将被视为不完整的下载,并且只能(length(remote) - length(local)) bytes
将被下载并附加到本地文件的末尾。
Important
-c
仅有的作品(参见 -c 选项下的最后一行)使用 FTP 服务器,并且HTTP servers that support the Range header
在您的情况下是 HTTP。http://playerservices.streamtheworld.com/api/livestream-redirect/WRTI_JAZZ.mp3
祝你好运!
请随意添加更多详细信息。