我使用 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
其中任何一個,因此您需要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."
如所寫,每次中斷後都會啟動一個新檔案。您也可以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
所以,祝你好運!
請隨意添加更多詳細資訊。