这时候就在项目目录下的out目录里生成了可执行jar包,执行java -jar xxx.jar命令即可运行此程序,即在link中写入当日每日一图的链接地址。但是实际运行的时候发现报了一个错误GetPic.jar中没有主清单属性
用Ark(一个压缩工具)打开jar包,然后打开里面的META-INF/MANIFEST.MF,查看是否有Main-Class项,估计是没有,然后加入一行Main-Class: GetPic其中GetPic为主类名。注意Main-Class:和GetPic之间有一个空格。
这样运行jar包就可以成功了,成功将当日每日一图的地址写入link文件中。
下载图片到指定位置使用下面的命令可以将link中的链接取出来作为wget的下载链接,使用-O选项给图片指定地址并命名,命名为当天的日期。
wget `cat link` -O ./pic/$(date "+%Y%m%d").jpeg所以完整的shell脚本如下:
#!/bin/bash java -jar GetPic.jar wget `cat link` -O ./pic/$(date "+%Y%m%d").jpeg手动执行脚本完成对图片的下载。
启动定时任务既然是每日一图,那就应该每天定时去获取这个图片,利用linux的crontab工具可以实现这一需求。
先检查crond服务是否正常启动:
service cron status然后将这个脚本加入到定时计划中,这个是指定每天早上6点下载一次
0 6 * * * sh ~/zhangqi/getPic/getPic.sh然后就开始等待第二天的6点,结果执行失败。
分析原因&解决问题我们手动执行这个脚本成功下载到了文件,但加到定时任务里执行失败,分析有以下几个可能的原因:
定时任务没有成功启动
shell里面某个任务没有成功启动
为了排除第一个可能的错误,写了一个每分钟输出hello world到日志文件的命令后,发现定时任务成功启动,这样就排除了第一种可能。这样一来就说明shell里面某些任务没有启动。
先试着测试第一个执行jar包的命令,发现执行失败,然后将执行这个jar包换成了一个Hello Word的程序,发现还是失败。推测可能是Java程序执行出错,但手动确实正常执行。去网上查到一个帖子说crontab不会知道你脚本里需要用到的所有环境变量,突然就明白是没有指明环境变量,脚本中直接使用Java命令失败导致的错误。在脚本中输出$JAVA_HOME果然没有结果。
找到问题后就明确方向了,在脚本开头引入环境变量
#!/bin/bash . /etc/profile java -jar GetPic.jar if [ $? -eq 0 ]; then echo 'success' >> ./log.txt else echo 'jar包运行出错' >> ./log.txt exit fi wget `cat link` -O ./pic/$(date "+%Y%m%d").jpeg再次测试发现还是出错,但这次输出$JAVA_HOME成功,说明并不是环境变量的问题,仔细考虑了下怀疑是路径的问题,在脚本中输出pwd到日志发现确实如此,然后加上一句cd命令。
#!/bin/bash . /etc/profile cd /home/ubuntu/zhangqi/getPic java -jar GetPic.jar if [ $? -eq 0 ]; then echo 'success' >> ./log.txt else echo $JAVA_HOME >> ./log.txt exit fi wget `cat link` -O ./pic/$(date "+%Y%m%d").jpeg至此,运行成功。最后加上日志信息,方便万一以后出错来debug。然后根据自己想要的用途来使用这些精美图片即可。
#!/bin/bash . /etc/profile cd /home/ubuntu/zhangqi/getPic java -jar GetPic.jar echo $(date "+%Y-%m-%d-%H-%M-%S") >> ./log.txt if [ $? -eq 0 ]; then echo 'success to getUrl' >> ./log.txt else echo 'jar包执行错误,检查该链接还是否正确https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1' >> ./log.txt exit fi wget `cat link` -O ./pic/$(date "+%Y%m%d").jpeg if [ $? -eq 0 ]; then echo 'success to download' >> ./log.txt else echo '下载失败,检查网络和下载链接' >> ./log.txt cat link >> ./log.txt exit fi