Centos8一键启动多个Springboot jar包 改进版

简介: Centos8一键启动多个Springboot jar包 改进版

一、前言

上篇《Centos8一键启动多个Springboot jar包》写了在centos环境下如何快速启动多个jar包。实际使用下来还是会发现不够完美,如我想重新启动10个jar包里面的两个,我得这么写:

./start.sh restart test1.jar; ./start.sh restart test2.jar; ./start.sh restart test3.jar;

命令很冗余,我能不能简化一下呢?说干就干。

二、步骤

2.1 获取参数

我们先来了解一下下面的命令

### start.sh
#!/bin/bash
echo "$*"
echo "$@"
echo "${@:2}"

当执行命令

./start.sh start gateway auth

效果如下:

start gateway auth
start gateway auth
gateway auth

由此看得出$*$@效果是类似的,而${@:2}是获取从第二个参数开始的其他参数。

2.2 循环遍历多个参数

再来看下面一段代码

### start.sh
#!/bin/bash
while [ $# != 0 ];do
  echo "第一个参数为:$1,参数个数为:$#"
  shift
done

执行上面同样的命令,看看效果

第一个参数为:gateway,参数个数为:2
第一个参数为:auth,参数个数为:1

可以看出来$#是参数个数;$1是获取第一个参数;shift是向左移动一位,也就是说每运行一次就会把最左边的参数移除。

那我们通过上面两段代码是不是可以实现对原始脚本的优化呢?

2.3 脚本改造

具体代码请看

#! /bin/bash
# 模块,注意要与启动的jar包数量相同
MODULES=(gateway auth)
# jar包路径
JAR_PATH='/app/lib'
# 日志路径
LOG_PATH='/app/logs'
start() { 
  #循环遍历
  while [ $# != 0 ];do
  local MODULE=
  local time1=
  local JAR_NAME=
  local commandOk=0
  local count=0
  local ok=0  
    local command="$1"
    for((i=0;i<${#MODULES[@]};i++))
      do
        MODULE=${MODULES[$i]}
          JAR_NAME=$MODULE.jar
          if [ "$command" == "all" ] || [ "$command" == "$MODULE" ];then
            commandOk=1
            count=0
            PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
            if [ -n "$PID" ];then
                echo "$MODULE:已经运行,PID=$PID"
            else
                exec nohup java -Xms256m -Xmx512m -Dspring.profiles.active=prod -jar $JAR_PATH/$JAR_NAME >>$LOG_PATH/$MODULE.log  2>&1 &
                PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
                while [ -z "$PID" ]
                do
                  if (($count == 10));then
                     echo "$MODULE:$(expr $count \* 10)秒内未启动,请检查!"
                     break
                  fi
                  count=$(($count+1))
                  echo "$MODULE启动中.................."
                  sleep 10s
                  PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
                done
                ok=$(($ok+1))
                time1=$(date "+%Y-%m-%d %H:%M:%S")
                echo "$time1--$MODULE:启动成功,PID=$PID"
                sleep 3s
            fi
          fi
        done
        if(($commandOk == 0));then
          echo "第二个参数输入错误"
        else
          echo "............本次共启动:$ok个服务..........."
        fi
    shift
  done
}
 
stop() {
  #循环遍历
  while [ $# != 0 ];do
    local MODULE=
    local JAR_NAME=
    local command="$1"
    local commandOk=0
    local ok=0
    for((i=0;i<${#MODULES[@]};i++))
    do
      MODULE=${MODULES[$i]}
      JAR_NAME=$MODULE.jar
      if [ "$command" = "all" ] || [ "$command" = "$MODULE" ];then
        commandOk=1
        PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
        if [ -n "$PID" ];then
          echo "$MODULE:准备结束,PID=$PID"
          kill -15 $PID
          PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
          while [ -n "$PID" ]
          do
            sleep 3s
            PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
          done
          echo "$MODULE:成功结束"
          ok=$(($ok+1))
        else
          echo "$MODULE:未运行"
        fi
      fi
    done
    if (($commandOk == 0));then
      echo "第二个参数输入错误"
    else
      echo "............本次共停止:$ok个服务............"
    fi
  shift
done
}
 
 
case "$1" in
  start)
    start "${@:2}"
  ;;
  stop)
    stop "${@:2}"
  ;;
  restart)
    stop "${@:2}"
    sleep 3s
    start "${@:2}"
  ;;
  *)
    echo "第一个参数请输入:start|stop|restart"
    exit 1
  ;;
esac

目录结构:

脚本执行命令

# 启动若干个jar
./start.sh (restart|start) gateway auth
#启动或关闭全部进程
./start.sh (restart|start|stop) all

这样的写法比原来的简便多了。

相关文章
|
3月前
|
Java 应用服务中间件 Spring
为什么SpringBoot的 jar 可以直接运行?
SpringBoot的 jar 可以直接运行的原因
380 2
|
1月前
|
数据可视化 Java 应用服务中间件
springboot打war包,成功部署
这篇文章介绍了如何将Spring Boot项目打包成WAR文件,并成功部署到Tomcat服务器的详细步骤。
114 0
springboot打war包,成功部署
|
1月前
|
Java 数据库连接 mybatis
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
该文档详细介绍了如何在Springboot Web项目中整合Mybatis,包括添加依赖、使用`@MapperScan`注解配置包扫描路径等步骤。若未使用`@MapperScan`,系统会自动扫描加了`@Mapper`注解的接口;若使用了`@MapperScan`,则按指定路径扫描。文档还深入分析了相关源码,解释了不同情况下的扫描逻辑与优先级,帮助理解Mybatis在Springboot项目中的自动配置机制。
125 0
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
|
3月前
|
Java Maven
构建Springboot项目、实现简单的输出功能、将项目打包成可以执行的JAR包(详细图解过程)
这篇文章详细介绍了构建SpringBoot项目的过程,包括新建工程、选择环境配置、添加依赖、项目结构说明,并演示了如何编写一个简单的Controller控制器实现输出功能,最后讲解了如何使用Maven将项目打包成可执行的JAR包,并提供了运行JAR包的命令和测试效果。
构建Springboot项目、实现简单的输出功能、将项目打包成可以执行的JAR包(详细图解过程)
|
3月前
|
SQL 前端开发 Java
在IDEA中使用Maven将SpringBoot项目打成jar包、同时运行打成的jar包(前后端项目分离)
这篇文章介绍了如何在IntelliJ IDEA中使用Maven将Spring Boot项目打包成可运行的jar包,并提供了运行jar包的方法。同时,还讨论了如何解决jar包冲突问题,并提供了在IDEA中同时启动Vue前端项目和Spring Boot后端项目的步骤。
在IDEA中使用Maven将SpringBoot项目打成jar包、同时运行打成的jar包(前后端项目分离)
|
3月前
|
Java Docker 容器
SpringBoot Jar 包太大 瘦身 【终极版】
SpringBoot Jar 包太大 瘦身 【终极版】
251 1
|
4月前
|
弹性计算 Java Serverless
Serverless 应用引擎操作报错合集之上传自定义JAR包,启动时报错,是什么导致的
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
3月前
|
前端开发 JavaScript Java
【Azure 应用服务】App Service For Windows 中如何设置代理实现前端静态文件和后端Java Spring Boot Jar包
【Azure 应用服务】App Service For Windows 中如何设置代理实现前端静态文件和后端Java Spring Boot Jar包
|
3月前
|
Java
SpringBoot Jar 包太大 瘦身 【初试】
SpringBoot Jar 包太大 瘦身 【初试】
26 0
|
3月前
|
Java Maven
SpringBoot 引用仓库中没有 第三方包 - 将jar 包安装本地 maven
SpringBoot 引用仓库中没有 第三方包 - 将jar 包安装本地 maven
37 0