分享一个利用wget的限时、限速下载脚本
有这么一个需求:有一系列图片url(只是url而已)存在文件里(或别的存储里),我需要写一个后台任务程序,把这些url一个个down成图片,因此,需要注意以下几点:
1.如果图片很大(比如超过2M),那么需要在发现后停止下载;
2.如果图片所在网站速度很慢,不能一直等它下完,超时就kill;
3.更高层的程序可能会多进程地调用此脚本来完成并行下载,因此这个脚本最好限个速,保证服务器带宽稳定。
linux下有一个非常好的下载工具wget,直接使用这个工具来帮助完成上述任务能节约开发成本,并且稳定可靠;不过,在看完了man wget后,发现没有办法配置wget使得脚本满足第1条要求(即限制下载大小),貌似沾点边的--quota却对单个下载url是无效的,因此,稍微做了一点shell编程,变通地解决了该问题。
先是下载脚本:
#!/bin/bash##usage: ./singleDown dirName fileName urlif [ $# -lt 3 ]thenecho 'usage: ./singleDown.sh dirName fileName url'exit 1fi##重试次数retryTime=3##等待超时(s)idleTimeOut=7##下载限时downTimeOut=16##下载限速limitRate=128k##每次重试的间隔时间(s)waitRetry=1url=`echo "$3" | sed "s/ /%20/g"`postFix=`echo $url | awk -F. '{print $NF}'`wget -q -nc --no-cookies --ignore-length -t $retryTime -T $idleTimeOut --limit-rate=$limitRate --waitretry=$waitRetry -O $1/$2.$postFix $url &downPid=$!./sleepAndKill.sh $downTimeOut $downPid &clockPid=$!wait $downPiddownResult=$?ps $clockPidif [ $? -eq 0 ]thenkill -9 $clockPidfiexit $downResult#!/bin/bash##usage: timeOut(s) pidToKillif [ $# -lt 2 ]thenecho 'usage: timeOut(s) pidToKill'exit 1fisleep $1ps $2if [ $? -eq 0 ]thenkill -9 $2fi