java微服务故障检测自动恢复脚本

目的:

实现java微服务进程的运行保障,故障发现和自动恢复,保障系统业务运行

原理:

通过持续监测java服务的tcp端口,判断进程是否存在——故障检测

定义各个jar的启动命令,检测到故障后可自动执行启动命令——故障恢复

针对恢复后的进程进行再次检测,若无法恢复则关闭nginx进行vip漂移——nginx+keepalived

变量:

端口号、对应服务名、服务启动命令、指定nacos地址文件、java虚机的资源分配、jar包的路径、nginx的pid、循环检测的时间

命令:

需要安装nc命令,用于检测端口状态

yum install nc

脚本内容:

#!/bin/bash

#脚本运行环境需要安装nc

#nacos地址文件路径、jar包路径、java虚机内存大小
NACOS=/x/x/x	#nacos文件地址
pwd=/x/x/x		#jar包路径
MIN=xxx			#java虚拟机初始内存
MAX=xxx			#java虚拟机最大内存
# 定义要检测的端口和对应的服务名和启动命令,服务名写可被过滤到的进程名称关键字
declare -A port_services=(
  ["8101"]="bridata-user"
  ["8102"]="bridata-auth"
  ["8103"]="bridata-log"
  ["8200"]="beidata-gateway"
  ["8104"]="bridata-system"
)
declare -A service_start=(
  ["bridata-user"]="nohup java -Xms$MIN -Xmx$MAX -jar $PWD/aaa.jar --spring.profiles.active=dev --spring.bootstrap.location=$NACOS >aaa.log 2>&1 &"
  ["bridata-auth"]="nohup java -Xms$MIN -Xmx$MAX -jar $PWD/bbb.jar --spring.profiles.active=dev --spring.bootstrap.location=$NACOS >bbb.log 2>&1 &"
  ["bridata-log"]="nohup java -Xms$MIN -Xmx$MAX -jar $PWD/ccc.jar --spring.profiles.active=dev --spring.bootstrap.location=$NACOS >ccc.log 2>&1 &"
  ["beidata-gateway"]="nohup java -Xms$MIN -Xmx$MAX -jar $PWD/ddd.jar --spring.profiles.active=dev --spring.bootstrap.location=$NACOS >ddd.log 2>&1 &"
  ["bridata-system"]="nohup java -Xms$MIN -Xmx$MAX -jar $PWD/eee.jar --spring.profiles.active=dev --spring.bootstrap.location=$NACOS >eee.log 2>&1 &"
)

# 定义Nginx进程名
nginx_process=$(ps -ef | grep nginx | grep -v grep | awk '{print $2}')

# 定义检测间隔(秒)
interval=10

# 循环检测端口连通性
while true; do
  for port in "${!port_services[@]}"; do
    # 使用nc命令检测端口连通性
    nc -z -w1 localhost "$port"
    if [[ $? -ne 0 ]]; then
      # 端口不可用,查找对应的服务进程并杀死
      service="${port_services[$port]}"
      pid=$(ps -ef | grep "$service" | grep -v grep | awk '{print $2}')
      if [[ -n $pid ]]; then
        echo "Port $port is not available. Killing service $service (PID: $pid)..."
        kill -9 "$pid"
      fi

      # 启动对应的服务
      echo "Starting service $service..."
      start="${service_start[$service]}"
      eval "$start"
      if [[ $? -eq 0 ]]; then
        # 等待一段时间
        sleep 20

        # 再次检查端口是否可用
        nc -z -w1 localhost "$port"
        if [[ $ -eq 0 ]]; then
          # 端口可用,继续监控其他端口
          echo "Service $service 端口正常。。。"
        else
          # 端口不可用,关闭Nginx进程
          echo "Service $service 端口号: $port ,端口仍不可用,将关闭nginx。。。"
          kill -9 "$nginx_process"
        fi
      else
        # 启动命令无法启动服务,关闭Nginx进程
        echo "无法启动 $service. 将关闭nginx进程。。。"
        kill -9 "$nginx_process"
      fi
    fi
  done
  sleep "$interval"
done

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值