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

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

总结

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

相关文章

  • 一个Shell小脚本精准统计Mysql每张表的行数实现

    一个Shell小脚本精准统计Mysql每张表的行数实现

    这篇文章主要介绍了一个Shell小脚本精准统计Mysql每张表的行数实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Linux中多线程详解及简单实例

    Linux中多线程详解及简单实例

    这篇文章主要介绍了Linux中多线程详解及简单实例的相关资料,这里对线程概念及优缺点做了详细介绍并说明如何创建和应用,需要的朋友可以参考下
    2017-07-07
  • shell脚本编程之循环语句学习笔记

    shell脚本编程之循环语句学习笔记

    这篇文章主要介绍了shell脚本编程之循环语句学习笔记,本文内容较简单,可以作为shell循环语句的备忘录,忘记怎么写时来看看吧~需要的朋友可以参考下
    2014-09-09
  • Shell之免交互的实现

    Shell之免交互的实现

    本文主要介绍了Shell之免交互的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Linux Shell脚本的编程之正则表达式

    Linux Shell脚本的编程之正则表达式

    这篇文章主要介绍了Linux Shell脚本的编程之正则表达式的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • 同一个文件在windows和linux下计算md5哈希不一致的原因及解决方法

    同一个文件在windows和linux下计算md5哈希不一致的原因及解决方法

    下面小编就为大家带来一篇同一个文件在windows和linux下计算md5哈希不一致的原因及解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • 建立基于虚拟用户的VSftpd服务

    建立基于虚拟用户的VSftpd服务

    这篇文章主要介绍了建立基于虚拟用户的VSftpd服务的相关资料,需要的朋友可以参考下
    2015-09-09
  • 在 SHELL 脚本中调用另一个 SHELL 脚本的方法(报错: go:not found)

    在 SHELL 脚本中调用另一个 SHELL 脚本的方法(报错: go

    在Linux平台上开发,经常会在console(控制台)上执行另外一个脚本文件,经常用的方法有:./my.sh 或 source my.sh 或 . my.sh;这三种方法有什么不同呢?这篇文章主要介绍了在 SHELL 脚本中调用另一个 SHELL 脚本的方法(报错: go:not found),需要的朋友可以参考下
    2023-08-08
  • expect中为send语句上加变量的代码

    expect中为send语句上加变量的代码

    expect中为send语句上加变量,感兴趣的朋友可以看看
    2013-02-02
  • linux启动流程详细介绍

    linux启动流程详细介绍

    这篇文章主要介绍了linux启动流程详细介绍的相关资料,需要的朋友可以参考下
    2017-05-05

最新评论