linux宕机重启后 执行脚本按顺序启动各个服务
场景:
服务器:linux centos 8.2
现docker容器里跑的程序有:
1.服务发现与注册:nacos
2.网关:gateway
3.微服务:org等...
4.docker外还跑了些java -jar 直启的微服务:facereport
服务器最近一次重启,nacos起来了,但是某几个微服务访问不通。docker ps
一看其实就是有几个微服务忘记配开机自启压根没起来,当时以为是nacos没启动好,这几个微服务启动时没注册进去...然后拿着这个错误的思路去写了个脚本。。。写完才发现,根本不需要!(原因查看这篇:nacos状态对微服务的影响测试)尴尬。不过还是记录下脚本吧。。
思路:
脚本很简单,就是顺序启动你的服务,大致按照这个顺序:

如果你需要判断数据库的话,也可以把数据库放在服务注册前面。
脚本代码:
#!/bin/bash
# 用途:linux centos 8.2系统宕机重启后,依次启动各个服务
# 服务启动顺序:
# 1.服务注册与发现(nacos)
# 2.配置中心(暂无)
# 3.网关服务(gateway)
# 4.监控服务(暂无)
# 5.微服务(org profile等)
# 前提:docker能开机自启动
# 注意:赋予此脚本执行权限,执行过就不必执行了 # chmod +x ./autoStartService.sh
#
# ========================》配置-----start
# 服务器IP:
localHost="xxx.xxx.xx.xxx"
# [注册中心]:
registerName="nacos"
registerPort="8848"
# [微服务]:
# docker容器中的微服务名称数组(docker ps后的names列)
dockerServiceNameArr=(gateway org profile geo kri ct resistance quake stress hole earthsound kj470)
dockerServicePortArr=(81 82 83 84 85 86 87 88 89 90 91 92)
# java直启的微服务名称数组
javaServiceNameArr=(facereport)
javaServicePathJarArr=(/opt/spring-cloud-service/facereport/AppFacereport.jar)
javaServicePortArr=(93)
# 睡眠时间/秒
SLEEP_TIME=2
# 日志路径
LOG_PATH=/root/autoStartService/log
# ========================》配置-----end
CURRENT_TIME=""
CURRENT_DATE=""
getAtTime() {
CURRENT_TIME="$(date +%Y-%m-%d-%H:%M:%S) --- "
CURRENT_DATE=$(date +%Y-%m-%d)
}
# 一、等待初始化:
#sleep 120
# 启动函数
autoStartWebService() {
##如果日志路径不存在则创建
if [ ! -d "$LOG_PATH" ]; then
mkdir -p $LOG_PATH
fi
getAtTime
echo "--------------------------------------------" >>${LOG_PATH}/"$CURRENT_DATE"_autoStartService.log
echo "===》go autoStartWebService at $CURRENT_TIME" >>${LOG_PATH}/"$CURRENT_DATE"_autoStartService.log
# 启动后,睡眠30秒之后,继续循环,一共监测10次
for i in $(seq 1 10); do
getAtTime
echo "$CURRENT_TIME excuting(${i} times) function autoStartWebService" >>${LOG_PATH}/"$CURRENT_DATE"_autoStartService.log
startRegisterService
sleep $((${SLEEP_TIME} * 15))
done
echo "===》exit autoStartWebService at $CURRENT_TIME" >>${LOG_PATH}/"$CURRENT_DATE"_autoStartService.log
}
# 二、启动注册中心:
startRegisterService() {
echo "===>startRegisterService..."
req_message=$(nc -w 1 ${localHost} ${registerPort} </dev/null && echo "200")
if test $((req_message)) -eq 200; then
getAtTime
echo "$CURRENT_TIME Nacos is running..." >>${LOG_PATH}/"$CURRENT_DATE"_autoStartService.log
else
container_id=$(docker ps -a | grep ${registerName} | grep -v grep | awk '{print $1}')
getAtTime
echo "$CURRENT_TIME ${registerName} container id is ${container_id}, start it..." >>${LOG_PATH}/"$CURRENT_DATE"_autoStartService.log
echo "启动${registerName}..."
# docker start ${container_id}
sleep $SLEEP_TIME
fi
startDockerService
startJavaService
}
# 三、启动docker容器下的微服务:
startDockerService() {
echo "===>startDockerService..."
for i in $(seq 0 `expr ${#dockerServiceNameArr[@]} - 1`); do
dockerServiceName=${dockerServiceNameArr[$i]}
dockerServicePort=${dockerServicePortArr[$i]}
req_message=$(nc -w 1 ${localHost} ${dockerServicePort} </dev/null && echo "200")
if test $((req_message)) -eq 200; then
getAtTime
echo "$CURRENT_TIME ${dockerServiceName} service is running..." >>${LOG_PATH}/"$CURRENT_DATE"_autoStartService.log
else
container_id=$(docker ps -a | grep ${dockerServiceName} | grep -v grep | awk '{print $1}')
getAtTime
echo "$CURRENT_TIME ${dockerServiceName} service container id is ${container_id}, start it..." >>${LOG_PATH}/"$CURRENT_DATE"_autoStartService.log
echo "启动${dockerServiceName}..."
# docker start ${container_id}
sleep $SLEEP_TIME
fi
done
}
# 三、启动非docker容器下的微服务:
startJavaService() {
echo "===>startJavaService..."
for i in $(seq 0 `expr ${#javaServiceNameArr[@]} - 1`); do
javaServiceName=${javaServiceNameArr[$i]}
javaServicePathJar=${javaServicePathJarArr[$i]}
javaServicePort=${javaServicePortArr[$i]}
req_message=$(nc -w 1 ${localHost} ${javaServicePort} </dev/null && echo "200")
if test $((req_message)) -eq 200; then
getAtTime
echo "$CURRENT_TIME ${javaServiceName} service is running..." >>${LOG_PATH}/"$CURRENT_DATE"_autoStartService.log
else
getAtTime
echo "$CURRENT_TIME ${javaServiceName} service, start it..." >>${LOG_PATH}/"$CURRENT_DATE"_autoStartService.log
echo "启动${javaServiceName}..."
# nohup java -jar ${javaServicePathJar} &
sleep $SLEEP_TIME
fi
done
}
# 启动
autoStartWebService
############################# 附:现有服务的配置项 start
# # docker容器中的注册中心:
# PORT NAMES
# 8848 nacos
# # docker容器中的微服务:
# PORT NAMES
# 81 gateway
# 82 org
# 83 profile
# 84 geo
# 85 kri
# 86 ct
# 87 resistance
# 88 quake
# 89 stress
# 90 hole
# 91 earthsound
# 92 kj470
# # java直启的微服务:
# PORT NAMES pathJar
# 93 facereport /opt/spring-cloud-service/facereport/AppFacereport.jar
############################# 附:现有服务的配置项 end
网友评论