WGET:是否可以自动恢复 HTTP URL 的下载?

WGET:是否可以自动恢复 HTTP URL 的下载?

我使用 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
    

祝你好运!

请随意添加更多详细信息。

相关内容