有这么一个需求:有一系列图片url(只是url而已)存在文件里(或别的存储里),我需要写一个后台任务程序,把这些url一个个down成图片,因此,需要注意以下几点:
1.如果图片很大(比如超过2M),那么需要在发现后停止下载;
2.如果图片所在网站速度很慢,不能一直等它下完,超时就kill;
3.更高层的程序可能会多进程地调用此脚本来完成并行下载,因此这个脚本最好限个速,保证服务器带宽稳定。
linux下有一个非常好的下载工具wget,直接使用这个工具来帮助完成上述任务能节约开发成本,并且稳定可靠;不过,在看完了man wget后,发现没有办法配置wget使得脚本满足第1条要求(即限制下载大小),貌似沾点边的--quota却对单个下载url是无效的,因此,稍微做了一点shell编程,变通地解决了该问题。
先是下载脚本:
#!/bin/bash
##usage: ./singleDown dirName fileName url
if [ $# -lt 3 ]
then
echo 'usage: ./singleDown.sh dirName fileName url'
exit 1
fi
##重试次数
retryTime=3
##等待超时(s)
idleTimeOut=7
##下载限时
downTimeOut=16
##下载限速
limitRate=128k
##每次重试的间隔时间(s)
waitRetry=1
url=`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 $downPid
downResult=$?
ps $clockPid
if [ $? -eq 0 ]
then
kill -9 $clockPid
fi
exit $downResult
这个脚本分析目标url的后缀,根据传入的保存路径和保存文件名,将文件下载下来。
其中,仍然没有下载大小限制的配置,但我们注意到有一个'downTimeOut'和'limitRate',这两个相乘刚好2M,间接地解决了大小限制的问题;
然后这个'downTimeOut'是怎么实现的呢?是通过另一个脚本'sleepAndKill.sh'来实现的(wget中的配置项的所有timeout均指'idle Time',即等待时间,并非'下载时间',所以这个timeout必须另写脚本实现):
#!/bin/bash
##usage: timeOut(s) pidToKill
if [ $# -lt 2 ]
then
echo 'usage: timeOut(s) pidToKill'
exit 1
fi
sleep $1
ps $2
if [ $? -eq 0 ]
then
kill -9 $2
fi
这个脚本很简单,传入timeout和监控的pid,然后sleep,醒来后如果发现pid所代表的进程还在的话就Kill.
在第一个脚本中我们也看到这么一行:
kill -9 $clockPid
这个$clockPid是sleepAndKill.sh的id,也就是说,在运行的时候,下载脚本和sleepAndKill.sh在赛跑,谁先做完事情,就会主动去kill另一方,以保证脚本在尽可能短的时间内跑完:
如果下载脚本在16秒内跑完了(这时sleepAndKill.sh还在睡),就杀掉sleepAndKill.sh,任务结束(不然sleepAndKill.sh还在那傻睡);
如果下载脚本16秒后还没跑完,sleepAndKill.sh醒来,kill掉下载脚本,任务结束,保证不会down下超过2M的图片。
本来还考虑通过content-length来判断是否目标大于2M,不过content-length是不可靠的,且并不比上述方法来得简单。
用法:
./singleDown.sh ./ google http://www.google.cn/intl/zh-CN/images/logo_cn.gif
以上命令将google的logo保存在当前文件夹下,名叫'google.gif'
脚本在附件中。
脚本所调用的wget版本为:'GNU Wget 1.10.2',更古老的版本在加上'&'符号运行时的行为比较奇怪,可能会影响限时功能,不建议使用过于古老版本的wget。
分享到:
相关推荐
下载资源>把wget64.exe放置到C:\Windows\System32路径下>cmd 输入 wget64 下载链接地址
wget 下载工具 wget 下载工具 wget 下载工具 wget 下载工具
wget是一个从网络上自动下载文件的自由工具。它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理. 所谓的自动下载是指,wget可以在用户退出系统的之后在后台执行。这意味这你可以登录系统,启动一个wget下载任务,然后...
wget命令行下载工具,支持在命令行下下载,等同于linux 下的wget命令。适合批处理下自动下载。
wget是Linux中的一个下载文件的工具, wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上。 它用在命令行下。 对于Linux用户是必不可少的工具, 尤其对于网络...
windows wget.exe免费下载
windows下的wget下载工具!...这意味这你可以登录系统,启动一个wget下载任务,然后退出系统,wget将在后台执行直到任务完成,相对于其它大部分浏览器在下载大量数据时需要用户一直的参与,这省去了极大的麻烦。
网页下载工具,下载玩,解压缩直接使用就行了
wget 命令行下载工具, 支持https win10亲测, 下载https文件: https_wget 链接
linux 离线安装wget
wget是一个从网络上自动下载文件的自由工具,支持通过HTTP、HTTPS、FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理。
wget命令rpm安装文件,需要预先安装rpm,才可以配置。
wget for ,通过CMD下载文件
GNU Wget2 2.0 增加了 HTTP2 上传,通过新的 -download-attr 选项支持 HTML5 下载属性,“Accept-Encoding: lzip”支持,各种选项以提高与 GNU Wget 的向后兼容性,在输出中支持终端超链接,以及其他大量的改进和...
实现wget功能的程序--wget.py
一个详细介绍wget的pdf文件,希望能给需要的人提供帮助。
wget下载地址:https://ftp.gnu.org/gnu/wget/ 在wget的源代码中 src/url.c 这个文件中有wget如何处理文件名的函数url_file_name() url_file_name()在根据url的形式判断该保存为什么样的文件名,并进行了多方面的...
离线安装wget依赖包
wget支持HTTP HTTPS和FTP协议 可以使用HTTP代理 所谓的自动下载是指 wget可以在用户退出系统的之后在后台执行 这意味这你可以登录系统 启动一个wget下载任务 然后退出系统 wget将在后台执行直到任务完成 相对于其它...
linux命令行模式使用wget下载JDK 版本 jdk-8u60-linux-x64.tar.gz