使用脚本启动和关闭微服务
一、前言
假如在服务器中部署微服务不使用 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