• 分享两个实用的shell脚本


    各位,早上好啊~ 发现许久没有分享过技术文章了,今天分享两个部署项目时候比较实用的shell脚本

    一键部署shell脚本

    由于个人部署,会习惯把jar放到lib目录下面,如果你没有这个习惯,可以适当做一些修改。该脚本提供了一键启动、停止、重启、检查操作

    deploy.sh代码
    #!/bin/bash
    
    #这里可替换为你自己的执行程序,其他代码无需更改
    
    cd ../lib/
    jar_path=`pwd`
    APP_NAME=`ls -al  *.jar | awk '{print $9}'`
    #使用说明,用来提示输入参数
    usage() {
        echo "Usage: sh robotcenter.sh [start|stop|restart|status]"
        exit 1
    }
    
    #检查程序是否在运行
    is_exist(){
      pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`
      #如果不存在返回1,存在返回0     
      if [ -z "${pid}" ]; then
       return 1
      else
        return 0
      fi
    }
    
    #启动方法
    start(){
      is_exist
      if [ $? -eq 0 ]; then
        echo "${APP_NAME} is already running. pid=${pid}"
      else
        cd /home/dtx/common-shell
        echo `pwd`
        # 引入公用shell脚本参数,可以自行考虑需不需要
        . common_params.sh
        echo "启动堆大小: $java_mem_size"
        echo "------------------------------------------------------------------------------------------------------------"
        echo "java_gc: $java_gc"
        echo "------------------------------------------------------------------------------------------------------------"
        echo "启动profile参数:$profile"
        cd ${jar_path}
        nohup java  ${java_mem_size} ${java_gc}  -jar ${APP_NAME} ${profile} >/dev/null 2>&1 &
        is_exist
        if [ $? -eq 0 ]; then
           echo "${APP_NAME} is running"
        else
           echo "${APP_NAME} is running failed"
        fi
        sleep 2
      fi
    }
    
    #停止方法
    stop(){
      is_exist
      if [ $? -eq "0" ]; then
        kill -9 $pid
        echo "${APP_NAME} has stopped"
      else
        echo "${APP_NAME} is not running"
      fi  
    }
    
    #输出运行状态
    status(){
      is_exist
      if [ $? -eq "0" ]; then
        echo "${APP_NAME} is running. Pid is ${pid}"
      else
        echo "${APP_NAME} is NOT running."
      fi
    }
    
    #重启
    restart(){
      stop
      sleep 5
      start
    }
    
    #根据输入参数,选择执行对应方法,不输入则执行使用说明
    case "$1" in
      "start")
        start
        ;;
      "stop")
        stop
        ;;
      "status")
        status
        ;;
      "restart")
        restart
        ;;
      *)
        usage
        ;;
    esac
    

    重启效果如下

    image-20220423103254891

    彩色日志操作

    也是由于个人习惯,回把log4j打印的日志放到logs文件下面,可以自行做一些小调整即可

    colorfullog.sh代码
    #! /bin/bash
    tail  -300f  ../logs/stdout.log | perl -pe's/(INFO)|(DEBUG)|(WARN)|(ERROR)|(^[0-9-:.\s]{10,23})|((?<=[OGNR]\s)[0-9]{1,5})|((?<=\[.{15}\]\s).{1,40}(?=\s(:\s)|\s))/\e[1;32m$1\e[0m\e[1;36m$2\e[0m\e[1;33m$3\e[0m\e[1;31m$4\e[0m\e[1;34m$5\e[0m\e[1;35m$6\e[0m\e[1;36m$7\e[0m/g'
    

    打印出来的效果

    image-20220423103023248

    再进一步操作

    微服务时代,项目肯定是不会只有一个jar的,就拿本人自己写的项目来看(也是因为没有采用容器化部署,感觉搞不好,坑太多了),目前也是6个包了,尽管上述操作也还简单方便,只需要进到每个模块里面,执行deploy.sh即可

    不过本着精益求精的思想理念,到底有没有更加好方法,可以一劳永逸的,即使之后加服务,不需要修改太多东西的操作

    基于此,在模块平级里,新建一个common-shell的文件夹,里面放一个deploy_all.sh

    deploy_all.sh代码
    #! /bin/bash
    ## author:Amg
    ## 该shell脚本用于一键启动、停止、重启所有设置好的jar文件
    
    cd ..
    base_path=`pwd`
    # 即使加服务,只要符合约定就可以被扫描出来
    centers=`ls -al | grep dtx | awk '{print $9}'`
    echo "---------------------base path: ${base_path} ------------------------"
    
    ## 启动所有项目
    start(){
     
     for line in $centers
     do
       jarPath=${base_path}/$line/bin/
       echo "当前所在目录: ${jarPath},即将启动目录下的jar "
       cd ${jarPath}
       sh deploy.sh start
       echo "================================"
     done
    }
    
    ## 停止所有项目
    stop(){
    
    
     for line in $centers
     do
       jarPath=${base_path}/$line/bin/
       echo "当前所在目录: ${jarPath},即将停止目录下的jar "
       cd ${jarPath}
       sh deploy.sh stop
       echo "================================"
     done
    }
    
    
    ## 重启所有项目
    restart(){
    
    
     for line in $centers
     do
       jarPath=${base_path}/$line/bin/
       echo "当前所在目录: ${jarPath},即将重启目录下的jar "
       cd ${jarPath}
       sh deploy.sh restart
       echo "================================"
     done
    }
    
    ##检查项目状态
    status(){
    
     for line in $centers
     do
       jarPath=${base_path}/$line/bin/
       echo "当前所在目录: ${jarPath},即将检查目录下的jar运行情况"
       cd ${jarPath}
       sh deploy.sh status
       echo "================================"
     done
    
    }
    
    usage(){
     echo "该脚本用于一键启停,具体用法有start、stop、restart status"
    }
    #根据输入参数,选择执行对应方法,不输入则执行使用说明
    case "$1" in
      "start")
        start
        ;;
      "stop")
        stop
        ;;
      "status")
        status
        ;;
      "restart")
        restart
        ;;
      *)
        usage
        ;;
    esac
    

    image-20220423104246283

    该脚本的作用其实很简单,就是不断的循环进入到各个具体的模块,调用上面的deploy脚本,进行一系列的操作

    基于约定大于配置的思想,如果我们后续加服务,只需要在平级下面创建相同规则的文件夹,里面的结构也是存放lib,logs,bin即可

  • 相关阅读:
    PowerPC T2080部分板卡产品介绍
    【路径规划】基于matlab卡尔曼滤波、三次插值极速赛道赛车路径规划【含Matlab源码 2158期】
    【git】git配置自带的查看分支log图
    Java自定义线程池详解及代码实现(非直接调用ThreadPoolExecutor)
    从0到1学SpringCloud——11 gateway网关路由配置详解
    HMI-Board之LVGL应用
    vue移动端H5调起手机发送短信(兼容ios和android)
    Mapper.xml文件如何写集合遍历语句
    Numpy计算中的@、*、mutiply、dot的区分(含Python代码)
    Mono 支持LoongArch架构
  • 原文地址:https://www.cnblogs.com/iamamg97/p/16181729.html