Linux Shell脚本语句执行失败,后续语句继续执行的问题及解决

 更新时间:2023年06月17日 09:30:00   作者:Tornado_Liao  
这篇文章主要介绍了Linux Shell脚本语句执行失败,后续语句继续执行的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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

执行完上个命令后,延时等待相应时间再执行下一个命令

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解Linux查找目录下的按时间过滤的文件

    详解Linux查找目录下的按时间过滤的文件

    这篇文章主要介绍了Linux查找目录下的按时间过滤的文件 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • jenkins 实现shell脚本化定时执行任务的方法

    jenkins 实现shell脚本化定时执行任务的方法

    这篇文章主要介绍了jenkins 实现shell脚本化定时执行任务,解决访问是jenkins构建好之后将jar远程推送到生产服务器,提前退出后台执行服务器远程脚本,脚本通过ngnx提前切走nginx代理auction sleep 1800s,半小时后执行更新重启,具体操作过程跟随小编一起看看吧
    2022-01-01
  • exit(-1)或者return(-1)shell得到的退出码为什么是255

    exit(-1)或者return(-1)shell得到的退出码为什么是255

    exit(-1)或者return(-1)shell得到的退出码为是255,大家知道为什么吗?带着这个疑问来脚本之家学习下吧,本篇文章告诉大家答案
    2015-10-10
  • 用shell脚本监控进程是否存在 不存在则启动的实例

    用shell脚本监控进程是否存在 不存在则启动的实例

    这篇文章主要介绍了用shell脚本监控进程是否存在 不存在则启动的实例,需要的朋友可以参考下
    2016-03-03
  • shell脚本换行问题实战记录

    shell脚本换行问题实战记录

    换行相信大家都不陌生,下面这篇文章主要给大家介绍了关于shell脚本换行问题的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Linux中rpm命令用法详解

    Linux中rpm命令用法详解

    rpm命令是用于在基于RPM包管理系统的Linux发行版中安装、查询、升级和删除软件包的命令行工具,本文讲给大家详细的介绍一下Linux rpm命令的使用方法,感兴趣的同学跟着小编一起来看看吧
    2023-08-08
  • Shell实现批量操作文件的方法详解

    Shell实现批量操作文件的方法详解

    这篇文章主要为大家总结了一下Shell实现批量操作文件的命令,例如:查找某文件夹下指定文件所在的路径、批量删除某个文件夹下的指定文件,感兴趣的可以了解一下
    2022-09-09
  • 完美解决Linux搭建sftp出现Write failed:Broken pipe的问题

    完美解决Linux搭建sftp出现Write failed:Broken pipe的问题

    下面小编就为大家带来一篇完美解决Linux搭建sftp出现Write failed:Broken pipe的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 详解Shell if else语句的具体使用方法

    详解Shell if else语句的具体使用方法

    这篇文章主要介绍了详解Shell if else语句的具体使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Linux 命令expect使用详解

    Linux 命令expect使用详解

    expect是由Don Libes基于Tcl语言开发的,是一种脚本语言,主要应用于自动化交互式操作的场景,借助Expect处理交互的命令,本文给大家介绍Linux 命令expect使用详解,感兴趣的朋友一起看看吧
    2023-11-11

最新评论