美文网首页
linux宕机重启后 执行脚本按顺序启动各个服务

linux宕机重启后 执行脚本按顺序启动各个服务

作者: 愤怒的阿昆达 | 来源:发表于2021-03-18 10:06 被阅读0次

linux宕机重启后 执行脚本按顺序启动各个服务

场景:

服务器:linux centos 8.2
现docker容器里跑的程序有:
1.服务发现与注册:nacos
2.网关:gateway
3.微服务:org等...
4.docker外还跑了些java -jar 直启的微服务:facereport

服务器最近一次重启,nacos起来了,但是某几个微服务访问不通。docker ps一看其实就是有几个微服务忘记配开机自启压根没起来,当时以为是nacos没启动好,这几个微服务启动时没注册进去...然后拿着这个错误的思路去写了个脚本。。。写完才发现,根本不需要!(原因查看这篇:nacos状态对微服务的影响测试)尴尬。不过还是记录下脚本吧。。

思路:

脚本很简单,就是顺序启动你的服务,大致按照这个顺序:


image.png

如果你需要判断数据库的话,也可以把数据库放在服务注册前面。

脚本代码:

#!/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


相关文章

网友评论

      本文标题:linux宕机重启后 执行脚本按顺序启动各个服务

      本文链接:https://www.haomeiwen.com/subject/tnkucltx.html