使用脚本启动和关闭微服务

使用脚本启动和关闭微服务

一、前言

假如在服务器中部署微服务不使用 docker ,一个一个地启动服务感觉比较繁琐,就想着能不能使用一个命令实现一键启动,这里以微服务版的若依为例。

二、启动

思路是挨个启动服务,然后将命令放到脚本文件,简化后续的启动。

1、处理每个服务

这里以处理 gateway 模块为例,打包后的名称为 ruoyi-gateway.jar ,将它上传到服务器的 /www/wwwroot/equip/jar/gateway 目录,所以 gateway 模块的启动命令为:

powershell 复制代码
nohup java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/gateway/ruoyi-gateway.jar >  ./ruoyi-gateway.log &

解释:

"nohup":用于确保指定的命令或程序即使在用户退出终端或关闭终端的情况下,也能在后台继续运行,配合最后面的 & 使用。

"-Xms256m":设置初始堆为256m。

"-Xmx256m":设置最大堆为256m。

"> ./ruoyi-gateway.log":将服务日志输出到名为 ruoyi-gateway.log 的文件中,重启会覆盖日志。不加这个会把日志输出到名为 nohup.out 的文件中。

因为服务器内存只有8g,如果不做堆大小的限制,所有服务启动后会把服务器内存占满,这里对 gateway 的初始堆和最大堆限制为256m。

处理好命令后先执行一下命令能否正常使用,如下图所示:

确定命令没有问题时,记录一下服务启动所需时间,后面有用,其他服务也是类似处理。

2、编写启动脚本

这里已经处理好了所有的服务启动命令,创建一个 .sh 的脚本文件,这里名为 start-test.sh ,命令如下:

powershell 复制代码
touch start-test.sh

然后加入前面处理好的命令,这是我的:

powershell 复制代码
# 被调用的服务要先启动,根据启动时间设置命令执行的间隔

echo "start ruoyi-gateway..."
nohup java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/gateway/ruoyi-gateway.jar >  ./ruoyi-gateway.log &
sleep 5s

echo "start ruoyi-modules-file..."
nohup java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/file/ruoyi-modules-file.jar >  ./ruoyi-modules-file.log &
sleep 10s

echo "start ruoyi-modules-system..."
nohup java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/system/ruoyi-modules-system.jar >  ./ruoyi-modules-system.log &
sleep 20s

echo "start ruoyi-auth..."
nohup java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/auth/ruoyi-auth.jar >  ./ruoyi-auth.log &
sleep 10s

echo "start finish"

注意:

不能将初次创建好的脚本文件 start-test.sh 下载到本地编辑,再上传到服务器,会报换行符的问题。应该直接在服务器中编辑文件,或在本地编辑好内容后拷贝到服务器文件。

因为我将若依的服务调用方式改为了 dubbo ,要保证生产者先启动完成,所以就记录了服务的启动时间作为服务启动间的时间间隔。

3、其他启动脚本(无效,有兴趣可以看看)

上面的命令看起来差点意思,但至少能正常启动。

原本想做到循环里面遍历启动,但因为服务启动时间的不确定性,经常消费者先于生产者启动,启动完 gateway 模块其他就没反应了,就没有使用那种方式,有兴趣的小伙伴也可以研究一下,这是文件内容:

powershell 复制代码
# 定义数组,方式一
# 使用这种方式注意每个元素后面不能加","
# 使用"``"包住命令不会将命令中的空格换行
command_array=(
       `java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/gateway/ruoyi-gateway.jar >  ./ruoyi-gateway.log`
       `java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/file/ruoyi-modules-file.jar >  ./ruoyi-modules-file.log`
       `java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/system/ruoyi-modules-system.jar >  ./ruoyi-modules-system.log`
       `java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/auth/ruoyi-auth.jar >  ./ruoyi-auth.log`)

# 定义数组,方式二
#command_array[0]=`java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/gateway/ruoyi-gateway.jar >  ./ruoyi-gateway.log`
#command_array[1]=`java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/auth/ruoyi-auth.jar >  ./ruoyi-auth.log`
#command_array[2]=`java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/file/ruoyi-modules-file.jar >  ./ruoyi-modules-file.log`
#command_array[3]=`java -jar -Xms256m -Xmx256m /www/wwwroot/equip/jar/system/ruoyi-modules-system.jar >  ./ruoyi-modules-system.log`

echo "starting..."

for command in ${command_array[@]};
do
   nohup $command &
   sleep 10s
done

echo "start finish"

4、启动

在脚本文件所在目录,这里为 start-test.sh 文件所在目录,执行如下命令:

powershell 复制代码
sh start-test.sh

三、关闭

思路是拿到每个服务的进程id,再杀死对应的进程。

1、测试拿服务进程id的命令是否正确

这里只是测试拿到进程id的命令是否正确,任选一个服务测试即可。

还是以 gateway 为例,查询对应的进程id,命令如下:

powershell 复制代码
 ps -ef | grep /www/wwwroot/equip/jar/gateway/ruoyi-gateway.jar

第二列的就是我们需要的进程id,只要那个就行了,可以使用如下命令:

powershell 复制代码
ps aux | grep /www/wwwroot/equip/jar/gateway/ruoyi-gateway.jar | grep -v grep | awk '{print $2}'

不会输出第二列的进程id,只是看看命令有没有错误。

或者可以使用如下命令:

powershell 复制代码
ps -ef | grep -w /www/wwwroot/equip/jar/gateway/ruoyi-gateway.jar | grep -v grep | awk '{print $2}'

2、编写关闭脚本

创建一个 .sh 的脚本文件,这里名为 stop-test.sh ,命令如下:

powershell 复制代码
touch stop-test.sh

然后加入如下内容:

powershell 复制代码
# 定义数组,方式一
# 使用这种方式注意每个元素后面不能加","
array=("/www/wwwroot/equip/jar/gateway/ruoyi-gateway.jar"
       "/www/wwwroot/equip/jar/auth/ruoyi-auth.jar"
       "/www/wwwroot/equip/jar/file/ruoyi-modules-file.jar"
       "/www/wwwroot/equip/jar/system/ruoyi-modules-system.jar")

# 定义数组,方式二
#array[0]="/www/wwwroot/equip/jar/gateway/ruoyi-gateway.jar"
#array[1]="/www/wwwroot/equip/jar/auth/ruoyi-auth.jar"
#array[2]="/www/wwwroot/equip/jar/file/ruoyi-modules-file.jar"
#array[3]="/www/wwwroot/equip/jar/system/ruoyi-modules-system.jar"

for var in ${array[@]};
do
  # 获取进程id,方式一
  pid="ps aux | grep $var | grep -v grep | awk '{print \$2}'"

  #  获取进程id,方式二
  # pid="ps -ef | grep -w $var | grep -v grep | awk '{print \$2}'"

  # eval 会对后面的命令进行两遍扫描。如果第一遍扫描后,命令是个普通命令,则执行此命令;
  # 如果命令中含有变量的间接引用,则保证间接引用的语义。
  # 也就是说,eval 命令将会首先扫描命令行进行所有的置换,然后再执行该命令。因此,eval命令适用于那些一次扫描无法实现其功能的变量。
  pid=$(eval $pid)

  # 判断进程id是否为空,若不为空,则杀掉进程
  if [ "${pid}" == "" ]; then
      echo "process $var not exists"
  else
      # 杀掉进程
      kill -9 $pid
      echo "process $var killed success"
  fi
done

保存退出。

3、关闭

在脚本文件所在目录,这里为 stop-test.sh 所在目录,执行如下命令:

powershell 复制代码
sh stop-test.sh
相关推荐
GJCTYU15 分钟前
阿里云多端低代码开发平台魔笔使用测评
低代码·阿里云·云原生·容器·serverless·云计算
洛卡卡了18 分钟前
从单层到 MVC,再到 DDD:架构演进的思考与实践
架构·mvc
乌恩大侠1 小时前
O-RAN Fronthual CU/Sync/Mgmt 平面和协议栈
5g·平面·fpga开发·架构
YCyjs11 小时前
K8S群集调度二
云原生·容器·kubernetes
Hoxy.R11 小时前
K8s小白入门
云原生·容器·kubernetes
掘金-我是哪吒13 小时前
微服务mysql,redis,elasticsearch, kibana,cassandra,mongodb, kafka
redis·mysql·mongodb·elasticsearch·微服务
茶馆大橘14 小时前
微服务系列六:分布式事务与seata
分布式·docker·微服务·nacos·seata·springcloud
58沈剑15 小时前
80后聊架构:架构设计中两个重要指标,延时与吞吐量(Latency vs Throughput) | 架构师之路...
架构
为什么这亚子17 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
想进大厂的小王18 小时前
项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
redis·分布式·后端·spring cloud·微服务·架构