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

Low*_*ter 2 linux download wget cron

我使用 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."
Run Code Online (Sandbox Code Playgroud)

这是一个互联网广播流。我的问题是,虽然这工作正常,但有时流经常被“中断”(尽我所知)并且我最终会得到一个被截断的流副本。如果有一个开关,我可以扔给 WGET 说“中断后自动恢复”,我会非常非常高兴(非常!)。

有任何想法吗?

kru*_*ubo 5

正如 C0deDaedalus 所写,wget -c意思是通过发送“Range”标头来恢复下载部分下载的文件。由于您正在处理实时互联网流,因此此标志将无法按预期工作。充其量,它可能使您能够继续将流附加到同一个下载的文件中,而忽略在流中断时丢失了一个块的事实,并且充其量,丢失的块不会给您的 MP3 播放器带来麻烦。

无论如何,您似乎也有一个不同的问题:您的脚本需要实际检测wget进程何时过早结束,以便它甚至可以尝试恢复下载。 这是一种使用 的退出状态来检测进程是否已结束的方法kill -0 这意味着您不能只使用sleep 3600两者,因此您需要以不同的方式在 1 小时后结束。所以你会有这样的事情:

#!/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."
Run Code Online (Sandbox Code Playgroud)

正如所写,这会在每次中断后启动一个新文件。您也可以合并wget -c以将所有内容放入同一个文件中,但是您将无法轻松诊断有多少中断以及它们何时发生。