Linux Shell脚本语句执行失败,后续语句继续执行的问题及解决
作者:Tornado_Liao
Linux Shell脚本语句执行失败,后续语句继续执行
问题
写了一个自动部署java后端的脚本,大致如下:
A=password read -p "请输入密码:" PASSWD if [ "$PASSWD" == "$A" ] then echo "密码正确!" cd /auto_deployment/javaBackendPath/backendService git clean -f -d git reset --hard HEAD git pull mvn clean install -Dmaven.test.skip=true -Pprod if [ $? -eq 0 ] then echo "Succeed in building new commits." # 执行部署代码 fi else echo "密码错误,请重启输入!" fi
由于shell脚本和python这些语言执行时,不太一样。遇到错误和未成功执行的语句后并不会报错退出,而是会报错,然后继续执行后续的语句。
上段代码因为需要进入的“/auto_deployment/javaBackendPath/backendService”路径没有找到,就没有执行,而是再当前的目录下执行了之后git相关的语句,好巧不巧当前目录再半年前是设置过git但一直没有更新维护过的,整个文件夹就恢复到了半年前的样子,后面写的文件全部消失。最后是从当天的备份中还原回来的,花了4个小时。
解决方法
set -o errexit #增加这句话,出错之后就会退出啦 set -e #这句话和上一句是一样的,写一个就好了 A=password read -p "请输入密码:" PASSWD if [ "$PASSWD" == "$A" ] then echo "密码正确!" cd /auto_deployment/javaBackendPath/backendService git clean -f -d git reset --hard HEAD git pull mvn clean install -Dmaven.test.skip=true -Pprod if [ $? -eq 0 ] then echo "Succeed in building new commits." # 执行部署代码 fi else echo "密码错误,请重启输入!" fi
linux shell脚本执行完第一行命令完成后,在执行第二行命令问题处理
这段时间在给tomcat做日志分割,再使用定时任务去执行shell脚本时,发现切割后的日志文件老是被置空,手动执行shell脚本却没有任何问题。
下面为shell脚本内容
# 复制日志文件内容到新的文件中 cp /home/work/tomcat/logs/catalina.out /home/work/tomcat/logs/catalina_`date -d '-1 days' +%Y%m%d`.log # 清空tomcat默认日志输出文件 echo "" > /home/work/tomcat/logs/catalina.out
在多次测试后,发现是复制日志还没完成时,就已经将清空日志的命令给执行了。导致直接将空日志给复制到每天的日志文件里去了。
因此这个问题就变成了如何在shell脚本执行完第一条命令完成后,在执行第二条。
这个问题也挺常见的,经常出现于上一个命令对一个文件处理没有完成就进行了下一个命令对该文件进行操作的场景。
网上有很多方法
如:
① 在两条命令之间添加 &&
实测在这个场景中无效
②使用if else 或者 while,利用执行的结果去判断命令是否执行完成,然后进行下一步操作
觉得太过麻烦,没有进行测试
后续处理:
①分开使用两个shell脚本,然后分两次定时任务调用。
即将上一个shell脚本的两条命令分割成两个shell脚本,然后在定时任务里分别对两个shell脚本设定时任务执行即可。
②在shell脚本里使用延迟等待sleep(单条脚本服务过多可能依旧会发生日志置空问题)
# 复制日志文件内容到新的文件中 cp /home/work/tomcat/logs/catalina.out /home/work/tomcat/logs/catalina_`date -d '-1 days' +%Y%m%d`.log # 延迟等待3秒 sleep 3 # 清空tomcat默认日志输出文件 echo "" > /home/work/tomcat/logs/catalina.out
执行完上个命令后,延时等待相应时间再执行下一个命令
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。