我試圖創建一個bash腳本來從某個網站下載文件。在bash腳本中記錄執行時間並在需要太長時間時終止當前命令
他們的下載鏈接是連續的 - 例如,它只是id = 1,id = 2,id = 3一直到660000.唯一的要求是你必須登錄,這使得這有點困難。哦,並且登錄將在幾個小時後隨機超時,因此我必須重新登錄。
這是我當前的腳本,它在99%的時間內運行良好。
#!/bin/sh
cd downloads
for i in `seq 1 660000`
do
lastname=""
echo "Downloading file $i"
echo "Downloading file $i" >> _downloadinglog.txt
response=$(curl --write-out %{http_code} -b _cookies.txt -c _cookies.txt --silent --output /dev/null "[sample URL to make sure cookie is still logged in]")
if ! [ $response -eq 200 ]
then
echo "Cookie didn't work, trying to re-log in..."
curl -d "userid=[USERNAME]" -d "pwd=[PASSWORD]" -b _cookies.txt -c _cookies.txt --silent --output /dev/null "[login URL]"
response=$(curl --write-out %{http_code} -b _cookies.txt -c _cookies.txt --silent --output /dev/null "[sample URL again]")
if ! [ $response -eq 200 ]
then
echo "Something weird happened?? Response code $response. Logging in didn't fix issue, fix then resume from $(($i - 1))"
echo "Something weird happened?? Response code $response. Logging in didn't fix issue, fix then resume from $(($i - 1))" >> _downloadinglog.txt
exit 0
fi
echo "Downloading file $(($i - 1)) again incase cookie expiring caused it to fail"
echo "Downloading file $(($i - 1)) again incase cookie expiring caused it to fail" >> _downloadinglog.txt
lastname=$(curl --write-out %{filename_effective} -O -J -b _cookies.txt -c _cookies.txt "[URL to download files]?id=$(($i - 1))")
echo "id $(($i - 1)) = $lastname" >> _downloadinglog.txt
lastname=""
echo "Downloading file $i"
echo "Downloading file $i" >> _downloadinglog.txt
fi
lastname=$(curl --write-out %{filename_effective} -O -J -b _cookies.txt -c _cookies.txt "[URL to download files]?id=$i")
echo "id $i = $lastname" >> _downloadinglog.txt
done
所以基本上我把它做的是試圖移動到下一個文件中的設置之前下載一個隨機文件。如果下載失敗,我們假設登錄cookie不再有效,並告訴curl重新登錄。
這很好,我可以從它得到幾千個文件。但是會發生什麼 - 無論是我的路由器停了一兩秒鐘,還是他們的網站都停了一兩分鐘,捲曲就會坐在那裏,認爲它會下載好幾個小時。我曾經回過頭來花費24小時在同一個文件上。它似乎沒有能力知道轉移是否在中間時間結束 - 只有當它不能開始轉移時。
我知道如果將它與「睡眠」結合起來,有些方法可以終止命令的執行,但是因爲這必須是「智能」並從停止的地方重新開始,所以我不能殺死整個腳本。
有什麼建議嗎?如果我可以使用它來通過終端命令登錄,我願意使用curl以外的內容。
一個簡單的方法是設置相當於一個事件循環,並將命令產生爲子shell。在你的循環中,定期檢查任務是否完成,如果有必要的話,如果過了很多時間就終止它們。 –
@DavidHoelzer你可能是指_background jobs_(在命令的末尾用控制運算符'&開始),而不是_subshells_。 – mklement0
我不知道你可以用shell腳本來做到這一點,但是對於python和請求來說這是完全簡單的。 –