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

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

相关文章
|
安全 Java 持续交付
如何实现上传jar直接部署成功,这篇文章直接带你上手springboot实现jar包热更新!
本文详细讲解了在Spring Boot应用中实现Jar包热更新的实践方法。通过自定义类加载器(`HotClassLoader`),动态加载和卸载指定目录下的Jar包,结合Spring Bean动态注册机制,使新加载的类能够被Spring容器管理。同时,提供了文件上传接口,方便用户手动触发Jar包更新。文章还强调了安全性、依赖管理和线程安全等注意事项,并给出了测试步骤和总结,帮助开发者高效实现热更新功能,减少服务中断和提升开发效率。
|
XML Java 应用服务中间件
SpringBoot项目打war包流程
本文介绍了将Spring Boot项目改造为WAR包并部署到外部Tomcat服务器的步骤。主要内容包括:1) 修改pom.xml中的打包方式为WAR;2) 排除Spring Boot内置的Tomcat依赖;3) 添加Servlet API依赖;4) 改造启动类以支持WAR部署;5) 打包和部署。通过这些步骤,可以轻松地将Spring Boot应用转换为适合外部Tomcat服务器的WAR包。
829 64
SpringBoot项目打war包流程
|
Java Maven 开发者
编写SpringBoot的自定义starter包
通过本文的介绍,我们详细讲解了如何创建一个Spring Boot自定义Starter包,包括自动配置类、配置属性类、`spring.factories`文件的创建和配置。通过自定义Starter,可以有效地复用公共配置和组件,提高开发效率。希望本文能帮助您更好地理解和应用Spring Boot自定义Starter,在实际项目中灵活使用这一强大的功能。
1168 17
|
Java 应用服务中间件 Maven
SpringBoot项目打包成war包
通过上述步骤,我们成功地将一个Spring Boot应用打包成WAR文件,并部署到外部的Tomcat服务器中。这种方式适用于需要与传统Servlet容器集成的场景。
1729 8
|
Java 数据库连接 mybatis
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
该文档详细介绍了如何在Springboot Web项目中整合Mybatis,包括添加依赖、使用`@MapperScan`注解配置包扫描路径等步骤。若未使用`@MapperScan`,系统会自动扫描加了`@Mapper`注解的接口;若使用了`@MapperScan`,则按指定路径扫描。文档还深入分析了相关源码,解释了不同情况下的扫描逻辑与优先级,帮助理解Mybatis在Springboot项目中的自动配置机制。
1311 1
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
|
SQL 前端开发 Java
在IDEA中使用Maven将SpringBoot项目打成jar包、同时运行打成的jar包(前后端项目分离)
这篇文章介绍了如何在IntelliJ IDEA中使用Maven将Spring Boot项目打包成可运行的jar包,并提供了运行jar包的方法。同时,还讨论了如何解决jar包冲突问题,并提供了在IDEA中同时启动Vue前端项目和Spring Boot后端项目的步骤。
在IDEA中使用Maven将SpringBoot项目打成jar包、同时运行打成的jar包(前后端项目分离)
|
数据可视化 Java 应用服务中间件
springboot打war包,成功部署
这篇文章介绍了如何将Spring Boot项目打包成WAR文件,并成功部署到Tomcat服务器的详细步骤。
1612 0
springboot打war包,成功部署
|
Java Maven
构建Springboot项目、实现简单的输出功能、将项目打包成可以执行的JAR包(详细图解过程)
这篇文章详细介绍了构建SpringBoot项目的过程,包括新建工程、选择环境配置、添加依赖、项目结构说明,并演示了如何编写一个简单的Controller控制器实现输出功能,最后讲解了如何使用Maven将项目打包成可执行的JAR包,并提供了运行JAR包的命令和测试效果。
构建Springboot项目、实现简单的输出功能、将项目打包成可以执行的JAR包(详细图解过程)
|
Java Docker 容器
SpringBoot Jar 包太大 瘦身 【终极版】
SpringBoot Jar 包太大 瘦身 【终极版】
1196 1
|
前端开发 JavaScript Java
【Azure 应用服务】App Service For Windows 中如何设置代理实现前端静态文件和后端Java Spring Boot Jar包
【Azure 应用服务】App Service For Windows 中如何设置代理实现前端静态文件和后端Java Spring Boot Jar包
250 0