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

news2024/10/6 1:46:37

一、前言

上篇《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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1326589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么项目管理工具需要项目财务信息?

在讨论项目时&#xff0c;钱是绕不开的话题。 资金是项目管理中最重要的因素之一&#xff0c;与范围和时间并列&#xff0c;三者共同构成了 “三重约束”。例如&#xff0c;如果缩短项目时间&#xff0c;就必须增加成本。 如果无法清楚了解开支及其对项目的影响&#xff08;反…

TrustZone之可信操作系统

有许多可信内核&#xff0c;包括商业和开源的。一个例子是OP-TEE&#xff0c;最初由ST-Ericsson开发&#xff0c;但现在是由Linaro托管的开源项目。OP-TEE提供了一个功能齐全的可信执行环境&#xff0c;您可以在OP-TEE项目网站上找到详细的描述。 OP-TEE的结构如下图所示&…

成熟又专业的内外网文件交换系统,了解一下!

近年来全球网络安全威胁态势的加速严峻&#xff0c;使得企业对于网络安全有了前所未有的关注高度。越来越多的企业在网络安全体系建设和日常工作中&#xff0c;都面临一个核心问题&#xff0c;如何保护企业核心数据资产&#xff1f; 绝大多数企业都在内部实施了网络隔离&#x…

WEB测试之兼容性测试

1. 软件兼容性测试 兼容性测试是指待测试项目在特定的硬件平台上&#xff0c;不同的应用软件之间&#xff0c;不同的操作系统平台上&#xff0c;在不同的网络等环境中能正常的运行的测试。 兼容性测试的目的&#xff1a;待测试项目在不同的操作系统平台上正常运行&#xff0c…

如何通过ETLCloud的API对接功能实现各种SaaS平台数据对接

前言 当前使用SaaS系统的企业越来越多&#xff0c;当我们需要对SaaS系统中产生的数据进行分析和对接时就需要与SaaS系统提供的API进行对接&#xff0c;因为SaaS一般是不会提供数据库表给企业&#xff0c;这时就应该使用ETL&#xff08;Extract, Transform, Load&#xff09;的…

数据挖掘-09-IBM员工流失率预测(包括数据和代码)

文章目录 0. 代码数据下载1. 背景描述2. 探索性数据分析2.1 数据集分布2.2 特征的相关性2.3 散点图可视化 3. 特征工程和分类编程4. 实施机器学习模型3.1 随机森林分类器a. 通过随机森林进行特征排名b. 可视化树形图 3.2 梯度增强分类器a. 基于梯度增强模型的特征排序 3.3 结论…

《每天一分钟学习C语言·四》文本读写操作及二进制读写

fopen(参数1,参数2)&#xff0c;第一个参数是要打开的文件名&#xff0c;文件名字符串&#xff0c;第二个参数用于制定文件打开模式的一个字符串。 注&#xff1a;如果要打开某个盘的文本如F盘test文件夹下的test.txt文本&#xff0c;则fopen(“F:\test\test.txt”,”r”); 程序…

【Spring实战】创建第一个项目

文章目录 使用 Spring Initializr 创建第一个项目1. 打开官网2. 填写信息3. 生成工程4. 解压工程5. 导入 IDEA6. 编写 Hello world7. 启动项目8. 访问验证9. 详细代码最后 Spring 是一个强大且广泛使用的 Java 开发框架&#xff0c;提供了全面的基础设施和工具&#xff0c;用于…

springboot使用Validated实现参数校验

做为后端开发人员&#xff0c;一定有前端传的数据是可能会出错的警惕性&#xff0c;否则程序就可能会出错&#xff0c;比如常遇到的空指针异常&#xff0c;所以为了程序运行的健壮性&#xff0c;我们必须对每一个参数进行合法校验&#xff0c;就能避免很多不必要的错误&#xf…

刷题记录第五十一天-去除重复字母

题目要求的是字典序最小的结果。只需要理解一点就是按大小顺序排列的字符串的字典序就是最小的&#xff0c;如“abcd”这种。 解题思路如下&#xff1a; 首先明确要使用栈结构&#xff0c;并且是从栈底到栈顶递增&#xff0c;要尽可能保证递增&#xff0c;这样就能保证字典序最…

【Java系列】多线程案例学习——单例模式

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习JavaEE的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录…

第七节TypeScript 循环

1、简述 有的时候&#xff0c;我们可能需要多次执行同一块代码。一般情况下&#xff0c;语句是按顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。 循环语句允许我们多次执行一个语句或语句组。 循环语句流程图&#xff…

Mybatis-Plus——02配置SQL日志,CRUD增(新注解)

配置SQL日志&#xff0c;CRUD增 一、配置SQL日志二、CRUD——增insert2.1、主建生成策略2.2、主建设置自增插入————————如觉不错&#xff0c;随手点赞&#xff0c;关注&#xff0c;收藏(*&#xffe3;︶&#xffe3;)&#xff0c;谢谢~~ 一、配置SQL日志 mybatis-plus…

网络编程 DAY6 作业

1.使用数据库创建一个工人信息库&#xff0c;包含工号&#xff08;主键&#xff09;、姓名、年龄、薪资 2.添加三条工人信息&#xff08;可以完整信息&#xff0c;也可以非完整信息&#xff09; 3.修改某一个人的薪资&#xff08;确定的一个&#xff09; 4.展示出工资在10000到…

Linux目录和文件管理

一.Linux目录结构 Linux操作系统在定位文件或目录位置时&#xff0c;使用斜杠“ / ”进行分割&#xff08;区别于Windows操作系统中的反斜杠“ \ ”&#xff09;。整个树形目录结构中&#xff0c;使用独立的一个" / "表示根目录&#xff0c;根目录是Linux操作系统文…

传输层协议分析--第4关:UDP 包分析

任务描述 本关任务&#xff1a;能够掌握简单的 UDP 包分析。 相关知识 为了更好掌握本章内容&#xff0c;你需要了解的有&#xff1a; UDP 报文的简介&#xff1b;UDP 报文格式&#xff1b;Wireshark 软件中的 UDP 抓包分析。 UDP 简介 UDP&#xff08;User Datagram Pro…

【终极教程】cocos2dx-js 分批次混淆压缩js文件

说明: 1> 由于我们当前游戏框架的结构是平台形式的就是一个大厅里面有若干个子游戏,所以在发布的时候得区分子游戏和大厅了解了一下 project.json 里面有一个 jsList 可以把所有放进去的js文件压缩混淆成一个大的文件但是我们游戏的子游戏非常多 这样子弄显然不合适&#x…

如何设计树形结构

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 前置知识&#xff1a;前…

代码随想录算法训练营Day6 | 344.反转字符串、541.反转字符串||、替换数字、151.反转字符串中的单词、右旋字符串

LeetCode 344 反转字符串 本题思路&#xff1a;反转字符串比较简单&#xff0c;定义两个指针&#xff0c;一个 i 0, 一个 j s.length-1。然后定义一个临时变量 tmp&#xff0c;进行交换 s[i] 和 s[j]。 class Solution {public void reverseString(char[] s) {int i 0;int …

工程项目管理系统源码:Java版工程项目管理系统平台助力工程企业迈向数字化管理的巅峰

随着企业规模的不断扩大和业务的快速发展&#xff0c;传统的工程项目管理方式已经无法满足现代企业的需求。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;企业需要借助先进的数字化技术进行转型。本文将介绍一款采用Spring CloudSpring BootMybat…