提交 4ed75c52 authored 作者: 陈泽健's avatar 陈泽健

feat(script): 优化服务监测脚本实现容器模糊匹配

- 新增 nacos-service.sh 脚本,独立处理 Nacos 容器监测逻辑
- 修改 ujava2-startup.sh 脚本,移除 Nacos 相关功能并实现容器模糊匹配
- 为 PowerShell 检测脚本添加 NTP 服务状态转换功能
- 在 ujava2-startup.sh 中新增第二个 API 检查点,增强服务监测能力
- 实现容器名称模糊匹配机制,提高脚本适应性和容错能力
- 更新文档记录服务监测脚本优化 V2 需求及执行计划
上级 0b2100ee
......@@ -1174,16 +1174,18 @@ function Test-NTPService-Shell {
$serviceStatus = "stopped"
$timeSync = "unknown"
if ($output -match "NTP service: active \((.+)\)") {
$ntpService = $matches[1]
# 检查NTP服务状态
if ($output -match "NTP service:\s+active") {
$ntpService = "chronyd"
$serviceStatus = "running"
} elseif ($output -match "NTP service: inactive") {
} elseif ($output -match "NTP service:\s+inactive") {
$serviceStatus = "stopped"
}
if ($output -match "System clock synchronized: yes") {
# 检查时间同步状态
if ($output -match "System clock synchronized:\s+yes") {
$timeSync = "synchronized"
} elseif ($output -match "System clock synchronized: no") {
} elseif ($output -match "System clock synchronized:\s+no") {
$timeSync = "not_synchronized"
}
......@@ -2362,7 +2364,7 @@ function Main {
Write-Host ""
Write-Log -Level "INFO" -Message "========== 开始检测配置文件 IP =========="
if ($global:UseShellMode) {
Test-ConfigIPs-Shell -Server $server -PlatformType $platformType
$null = Test-ConfigIPs-Shell -Server $server -PlatformType $platformType
} else {
if ($platformType -eq "new") {
Test-NewPlatformIPs -ServerIP $server.IP -Username $server.User -Password $server.Pass -Port $server.Port
......@@ -2441,8 +2443,16 @@ function Main {
$ntpArray = @($ntpResults)
if ($ntpArray.Count -gt 0) {
$ntpFirst = $ntpArray[0]
# 将NTP状态转换为报告期望的状态格式
$ntpStatus = switch ($ntpFirst.Status) {
"running" { "正常" }
"stopped" { "异常" }
default { "未知" }
}
$ntpResultsHashtable = @{
Status = $ntpFirst.Status
Status = $ntpStatus
Detail = "$($ntpFirst.Daemon) - $($ntpFirst.TimeSync)"
}
}
......
# 服务监测脚本优化需求
## 代码路径
- 代码路径:[自动化部署脚本/x86架构/新统一平台/定时脚本/ujava2-startup.sh]
- 代码路径:[自动化部署脚本/x86架构/新统一平台/定时脚本/nacos-service.sh]
- 原始需求文档路径:[Docs/PRD/自动化部署脚本/新统一平台/需求文档/_PRD_新统一平台后端服务监测_需求文档.md]
## 功能需求
### 功能目标
**目标:** 拆分`ujava2-startup.sh`脚本。
### 需求描述
- 关于nacos相关的拆分出独立一份脚本`nacos-service.sh`,添加重试机制,原有的nacos检测逻辑不变,容器匹配方式改为模糊匹配。
- 将java服务的检测保留在脚本`ujava2-startup.sh`,将匹配规则改为模糊匹配。
#### nacos脚本描述
- 匹配容器:`nacos`,通过模糊匹配。
- 检测逻辑:
- 先检查容器是否正常运行,观察容器日志是否正常打印,无报错信息。
- 通过`curl -k https://服务器IP/nacos`,检查服务是否正常,保留原有重试机制。
- 如果服务正常,则返回`0`,否则返回`1`,并重启容器观察容器日志。再异常就不再处理,退出脚本。
#### ujava脚本描述
- 匹配容器:`ujava`,通过模糊匹配。
- 检测逻辑:
- 先检查容器是否正常运行,观察容器日志是否正常打印,无报错信息。
- 进入容器检查进程是否正常运行,无报错信息。如果有进程未启动,则在对应目录下执行`run.sh`脚本。
- 最后通过`curl -k https://服务器IP/platform/code``curl -k https://服务器IP/platform/newmeeting/api/systemConfiguration/systemConfig?companyNumber=CN-SZ-00-0201` ,检查服务是否正常,保留原有重试机制。
## 规范文档
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
- 问题总结: `Docs/PRD/01规范文档/_PRD_问题总结_记录文档.md`
- 方法总结: `Docs/PRD/01规范文档/_PRD_方法总结_记录文档.md`
- 文档规范: `Docs/PRD/01规范文档/_PRD_规范文档_文档规范.md`
- 测试规范: `Docs/PRD/01规范文档/_PRD_规范文档_测试规范.md`
---
\ No newline at end of file
# 服务监测脚本优化V2 - 计划执行文档
## 需求概述
拆分 `ujava2-startup.sh` 脚本,将 nacos 相关逻辑独立到 `nacos-service.sh`,容器匹配改为模糊匹配。
## 修改文件清单
### [x] 新建:nacos-service.sh
- **文件路径**: `自动化部署脚本/x86架构/新统一平台/定时脚本/nacos-service.sh`
- **功能**: nacos容器健康检查和自动重启
- **容器匹配**: 模糊匹配 `nacos`
### [x] 修改:ujava2-startup.sh
- **文件路径**: `自动化部署脚本/x86架构/新统一平台/定时脚本/ujava2-startup.sh`
- **修改内容**:
- 移除 nacos 相关逻辑
- 容器匹配改为模糊匹配 `ujava`
- 保留 Java 服务检测逻辑
- 新增第二个 API 检查点
---
## 一、nacos-service.sh 脚本设计
### 脚本功能
1. **容器模糊匹配**: 查找名称包含 `nacos` 的容器
2. **健康检查**:
- 检查容器是否正常运行
- 观察容器日志是否正常打印,无报错信息
3. **服务可用性检查**: `curl -k https://服务器IP/nacos`
4. **重试机制**: 保留原有重试机制
5. **异常处理**: 服务异常时重启容器,再异常则退出
### 检测流程
```
开始
├──→ 模糊查找 nacos 容器
│ └── 未找到 → 退出
├──→ 检查容器运行状态
│ └── 未运行 → 重启容器
├──→ 检查容器日志(最近50行)
│ └── 有 ERROR/Exception → 记录警告
├──→ curl 检查服务(带重试)
│ └── 失败 → 重启容器 → 检查日志
│ └── 仍异常 → 退出脚本
└──→ 结束
```
### 配置参数
```bash
CONTAINER_PATTERN="nacos" # 容器模糊匹配模式
NACOS_PORT="8848" # Nacos服务端口
NACOS_CHECK_URL="http://localhost:8848/nacos/" # 健康检查URL
RETRY_MAX_COUNT=3 # 最大重试次数
RETRY_INTERVAL=10 # 重试间隔(秒)
LOG_FILE="/data/logs/nacos-service.log" # 日志文件
```
---
## 二、ujava2-startup.sh 脚本修改
### 修改内容
#### 1. 移除的内容
- `check_unacos_health()` 函数
- `restart_unacos_if_needed()` 函数
- `check_services()` 中对 unacos 的检查调用
- 主流程中的 unacos 相关逻辑
#### 2. 修改的内容
**容器匹配改为模糊匹配**:
```bash
# 原代码(精确匹配)
CONTAINER_NAME="ujava2"
# 修改后(模糊匹配)
CONTAINER_PATTERN="ujava"
CONTAINER_NAME=$(docker ps --format "{{.Names}}" | grep -E "$CONTAINER_PATTERN" | head -n 1)
```
**新增第二个API检查点**:
```bash
# 原有检查
API_URL="https://192.168.5.44/platform/api/code"
# 新增检查
API_URL_2="https://192.168.5.44/platform/newmeeting/api/systemConfiguration/systemConfig?companyNumber=CN-SZ-00-0201"
```
#### 3. 主流程调整
```
开始
├──→ 模糊查找 ujava 容器
│ └── 未找到 → 退出
├──→ 平台 API 检查1(/platform/api/code)
│ └── 失败 → 强制重启关键服务
├──→ 平台 API 检查2(/platform/newmeeting/api/...)
│ └── 失败 → 记录日志(不强制重启)
├──→ 容器内 Java 服务检查
│ └── 有停止的服务 → 逐个重启
├──→ 宿主机 extapi 服务检查
│ └── 停止 → 重启
└──→ 6060 端口检查(malan)
└── 未监听 → 启动 malan
```
---
## 三、实施步骤
### 步骤1: 创建 nacos-service.sh
1. 创建脚本文件
2. 实现容器模糊匹配函数
3. 实现健康检查函数
4. 实现日志检查函数
5. 实现服务可用性检查函数(带重试)
6. 实现容器重启函数
7. 编写主流程
8. 添加执行权限
### 步骤2: 修改 ujava2-startup.sh
1. 移除 nacos 相关函数
2. 修改容器匹配为模糊匹配
3. 新增第二个 API 检查点
4. 修改主流程
5. 测试验证
### 步骤3: 验证测试
1. 测试 nacos 容器模糊匹配
2. 测试 nacos 服务异常时的重启逻辑
3. 测试 ujava 容器模糊匹配
4. 测试两个 API 检查点
5. 测试 Java 服务自愈功能
6. 测试 extapi 服务自愈
7. 测试 malan 服务启动
---
## 四、代码结构
### nacos-service.sh 结构
```bash
#!/bin/bash
# 配置参数
# 日志函数
# 容器模糊匹配函数
# 健康检查函数(容器状态)
# 日志检查函数(检查ERROR)
# 服务可用性检查函数(curl + 重试)
# 容器重启函数
# 主流程
```
### 修改后的 ujava2-startup.sh 结构
```bash
#!/bin/bash
# 配置参数(新增第二个API URL)
# 并发控制锁
# 日志函数
# API检查函数(支持两个检查点)
# 关键服务重启函数
# 容器模糊匹配函数(新增)
# Java服务管理函数
# 宿主机extapi服务函数
# 6060端口/malan服务函数
# 主流程(移除nacos逻辑)
```
---
## 五、注意事项
### 1. 容器模糊匹配安全性
- 使用 `head -n 1` 确保只操作第一个匹配的容器
- 添加日志输出匹配到的容器名称
### 2. 重试机制保留
- nacos-service.sh 保留原有的重试机制
- API 检查失败时记录详细日志
### 3. 日志文件分离
- nacos-service.sh: `/data/logs/nacos-service.log`
- ujava2-startup.sh: `/data/logs/ujava2-service-manager.log`
### 4. 服务器IP配置
- 建议通过环境变量或配置文件获取服务器IP
- 避免硬编码 IP 地址
---
## 六、优化功能回填
- [x] 脚本拆分完成,职责分离
- [x] 容器匹配改为模糊匹配
- [ ] 服务器IP配置化(后续优化)
- [ ] 统一配置文件管理(后续优化)
#!/bin/bash
#===================================================================================
# 功能说明:Java服务监控与自愈脚本(移除Nacos逻辑,使用模糊匹配)
# 文件路径:自动化部署脚本/x86架构/新统一平台/定时脚本/ujava2-startup.sh
# 创建日期:2026-05-13
# 修改日期:2026-05-13(V2版本:移除Nacos逻辑,容器模糊匹配)
#===================================================================================
# ========== 脚本并发控制 ==========
LOCK_FILE="/tmp/ujava2-startup.lock"
......@@ -7,23 +13,56 @@ flock -n 200 || {
echo "$(date '+%Y-%m-%d %H:%M:%S') [WARNING] 另一个实例正在运行,退出" | tee -a "$LOG_FILE"
exit 1
}
# 脚本退出时自动释放锁
# ====================================
LOG_FILE="/data/logs/ujava2-service-manager.log"
unacos_LOG="/data/logs/unacos_restart.log"
# ========== API检查重试配置参数 ==========
RETRY_MAX_COUNT=3 # 最大重试次数
RETRY_INTERVAL=30 # 重试间隔(秒)
API_REQUEST_TIMEOUT=10 # API请求超时(秒)
API_URL="https://192.168.5.44/platform/api/code" # API检查地址
SERVER_IP="192.168.5.44" # 服务器IP(可通过环境变量覆盖)
API_URL_1="https://${SERVER_IP}/platform/api/code" # API检查地址1
API_URL_2="https://${SERVER_IP}/platform/newmeeting/api/systemConfiguration/systemConfig?companyNumber=CN-SZ-00-0201" # API检查地址2
# ========================================
# 获取服务器IP(优先使用环境变量)
SERVER_IP="${JAVA_SERVER_IP:-$SERVER_IP}"
API_URL_1="https://${SERVER_IP}/platform/api/code"
API_URL_2="https://${SERVER_IP}/platform/newmeeting/api/systemConfiguration/systemConfig?companyNumber=CN-SZ-00-0201"
# ========== 容器模糊匹配配置 ==========
CONTAINER_PATTERN="ujava" # 容器模糊匹配模式
# ========================================
timestamp() {
date "+%Y-%m-%d %H:%M:%S"
}
# ========== 容器模糊匹配函数 ==========
# 功能:查找名称包含指定模式的容器
# 返回:容器名称,未找到返回空
find_java_container() {
local pattern="$1"
local container_name=$(docker ps --format "{{.Names}}" | grep -E "$pattern" | head -n 1)
if [ -z "$container_name" ]; then
echo "$(timestamp) [ERROR] 未找到匹配 '$pattern' 的运行中容器" | tee -a "$LOG_FILE"
return 1
fi
echo "$(timestamp) [INFO] 找到Java容器: $container_name" | tee -a "$LOG_FILE"
echo "$container_name"
return 0
}
# 获取Java容器名称(全局变量)
JAVA_CONTAINER=$(find_java_container "$CONTAINER_PATTERN")
if [ -z "$JAVA_CONTAINER" ]; then
echo "$(timestamp) [ERROR] 未找到Java容器,脚本退出" | tee -a "$LOG_FILE"
exit 1
fi
declare -A SERVICE_CMD_MAP=(
["auth"]="ubains-auth.jar"
["gateway"]="ubains-gateway.jar"
......@@ -49,8 +88,9 @@ declare -A SERVICE_SCRIPT_MAP=(
# 返回:0=成功,1=失败
# 输出:设置全局变量 API_HTTP_CODE 和 API_RESPONSE_BODY
check_api_request() {
local api_url="$1"
# 执行curl请求,使用 -s 静默模式,-S 显示错误信息
local response=$(curl -k -m ${API_REQUEST_TIMEOUT} -s -S -w "\n%{http_code}" "${API_URL}" 2>&1)
local response=$(curl -k -m ${API_REQUEST_TIMEOUT} -s -S -w "\n%{http_code}" "$api_url" 2>&1)
local curl_exit_code=$?
# 分离响应体和状态码
......@@ -97,17 +137,22 @@ check_should_retry() {
# 函数名:check_platform_api
# 功能:执行平台API检查,支持重试机制
# 参数:$1=API URL, $2=API描述(用于日志)
# 返回:0=成功,1=失败
check_platform_api() {
local api_url="$1"
local api_desc="$2"
local retry_count=0
local should_retry=false
local final_result=1
local http_code=""
local response_body=""
echo "$(timestamp) [INFO] 检查${api_desc}" | tee -a "$LOG_FILE"
# 首次请求
if check_api_request; then
echo "$(timestamp) [INFO] 平台API检查正常" | tee -a "$LOG_FILE"
if check_api_request "$api_url"; then
echo "$(timestamp) [INFO] ${api_desc}检查正常" | tee -a "$LOG_FILE"
return 0
fi
......@@ -127,19 +172,19 @@ check_platform_api() {
if [ -z "$http_code" ]; then
# 网络层面的错误(无HTTP状态码)
local error_info=$(echo "$response_body" | head -c 100)
echo "$(timestamp) [RETRY] 第${retry_count}次重试 platform API检查失败: ${error_info}" | tee -a "$LOG_FILE"
echo "$(timestamp) [RETRY] 第${retry_count}次重试 ${api_desc}失败: ${error_info}" | tee -a "$LOG_FILE"
else
# 有HTTP状态码的错误
echo "$(timestamp) [RETRY] 第${retry_count}次重试 platform API检查失败: HTTP ${http_code}" | tee -a "$LOG_FILE"
echo "$(timestamp) [RETRY] 第${retry_count}次重试 ${api_desc}失败: HTTP ${http_code}" | tee -a "$LOG_FILE"
fi
# 等待重试间隔
sleep $RETRY_INTERVAL
# 执行重试请求
if check_api_request; then
if check_api_request "$api_url"; then
# 重试成功
echo "$(timestamp) [RETRY] 第${retry_count}次重试 platform API检查成功" | tee -a "$LOG_FILE"
echo "$(timestamp) [RETRY] 第${retry_count}次重试 ${api_desc}检查成功" | tee -a "$LOG_FILE"
return 0
fi
......@@ -155,11 +200,11 @@ check_platform_api() {
# 重试全部失败
if [ $retry_count -eq $RETRY_MAX_COUNT ]; then
echo "$(timestamp) [RETRY] platform API检查重试${RETRY_MAX_COUNT}次后仍失败,触发强制重启关键服务" | tee -a "$LOG_FILE"
echo "$(timestamp) [RETRY] ${api_desc}检查重试${RETRY_MAX_COUNT}次后仍失败" | tee -a "$LOG_FILE"
fi
else
# 不应该重试(4xx错误)
echo "$(timestamp) [ERROR] 平台API检查失败: HTTP ${http_code}(确定性失败,不重试)" | tee -a "$LOG_FILE"
echo "$(timestamp) [ERROR] ${api_desc}检查失败: HTTP ${http_code}(确定性失败,不重试)" | tee -a "$LOG_FILE"
fi
return 1
......@@ -169,10 +214,10 @@ check_platform_api() {
# 修改后的重启关键服务函数
restart_critical_services() {
echo "$(timestamp) [WARNING] 开始强制重启gateway、auth、system服务" | tee -a "$LOG_FILE"
local services=("gateway" "auth" "system")
local restarted=0
for service in "${services[@]}"; do
# 无论服务是否运行,都先停止再启动
stop_service "$service"
......@@ -180,61 +225,38 @@ restart_critical_services() {
((restarted++))
fi
done
echo "$(timestamp) [SUMMARY] 已强制重启 $restarted 个关键服务" | tee -a "$LOG_FILE"
}
# 原有unacos健康检查函数
check_unacos_health() {
# 检查unacos容器是否运行
if ! docker inspect unacos2 &>/dev/null; then
echo "$(timestamp) [ERROR] unacos2容器未找到" | tee -a "$unacos_LOG"
return 1
fi
# 检查unacos容器是否处于运行状态
if [ "$(docker inspect -f '{{.State.Status}}' unacos2)" != "running" ]; then
echo "$(timestamp) [ERROR] unacos2容器未运行" | tee -a "$unacos_LOG"
return 1
fi
# 简单检查unacos API是否可访问
if ! curl -s -m 5 "http://localhost:8848/nacos/" &>/dev/null; then
echo "$(timestamp) [WARNING] unacos2服务不可访问" | tee -a "$unacos_LOG"
return 1
fi
return 0
echo "$(timestamp) [SUMMARY] 已强制重启 $restarted 个关键服务" | tee -a "$LOG_FILE"
}
get_service_pid() {
local service_key="$1"
local jar_path="${SERVICE_CMD_MAP[$service_key]}"
# 通过工作目录和jar文件名组合查找
case "$service_key" in
"meeting2.0")
docker exec ujava2 sh -c "ps aux | grep '[j]ava' | grep -F 'ubains-meeting-inner-api' | grep -F 'java-meeting2.0/config' | grep -v 'java-meeting3.0' | awk '{print \$2}' | head -1"
docker exec "$JAVA_CONTAINER" sh -c "ps aux | grep '[j]ava' | grep -F 'ubains-meeting-inner-api' | grep -F 'java-meeting2.0/config' | grep -v 'java-meeting3.0' | awk '{print \$2}' | head -1"
;;
*)
docker exec ujava2 sh -c "ps aux | grep -F '$jar_path' | grep -v grep | awk '{print \$2}' | head -1"
docker exec "$JAVA_CONTAINER" sh -c "ps aux | grep -F '$jar_path' | grep -v grep | awk '{print \$2}' | head -1"
;;
esac
}
is_service_running() {
local pid=$(get_service_pid "$1")
[ -n "$pid" ] && docker exec ujava2 sh -c "ps -p $pid >/dev/null 2>&1"
[ -n "$pid" ] && docker exec "$JAVA_CONTAINER" sh -c "ps -p $pid >/dev/null 2>&1"
}
start_service() {
local service_key="$1"
echo "$(timestamp) [START] $service_key" | tee -a "$LOG_FILE"
stop_service "$service_key"
docker exec -d ujava2 bash -c "nohup ${SERVICE_SCRIPT_MAP[$service_key]} > /var/log/${service_key}.log 2>&1 & echo \$! > /tmp/${service_key}.pid"
docker exec -d "$JAVA_CONTAINER" bash -c "nohup ${SERVICE_SCRIPT_MAP[$service_key]} > /var/log/${service_key}.log 2>&1 & echo \$! > /tmp/${service_key}.pid"
local timeout=30
while ((timeout-- > 0)); do
if is_service_running "$service_key"; then
......@@ -244,7 +266,7 @@ start_service() {
fi
sleep 1
done
echo "$(timestamp) [FAILED] $service_key 启动超时" | tee -a "$LOG_FILE"
return 1
}
......@@ -252,55 +274,19 @@ start_service() {
stop_service() {
local service_key="$1"
local pid=$(get_service_pid "$service_key")
[ -z "$pid" ] && return 0
echo "$(timestamp) [STOP] $service_key (PID: $pid)" | tee -a "$LOG_FILE"
docker exec ujava2 sh -c "kill $pid && sleep 1 || kill -9 $pid"
docker exec "$JAVA_CONTAINER" sh -c "kill $pid && sleep 1 || kill -9 $pid"
sleep 2
}
restart_unacos_if_needed() {
local stopped_count=$1
# 先检查unacos健康状态
if ! check_unacos_health; then
echo "$(timestamp) [WARNING] unacos2服务异常,将尝试重启" | tee -a "$unacos_LOG"
docker restart unacos2 >> "$unacos_LOG" 2>&1
if [ $? -eq 0 ]; then
echo "$(timestamp) [SUCCESS] unacos2容器重启成功" | tee -a "$unacos_LOG"
sleep 30
else
echo "$(timestamp) [ERROR] unacos2容器重启失败" | tee -a "$unacos_LOG"
fi
return
fi
# 原有逻辑:当停止的服务超过3个时重启unacos
if [ "$stopped_count" -gt 3 ]; then
echo "$(timestamp) [WARNING] 检测到 $stopped_count 个服务停止,将重启unacos2容器" | tee -a "$unacos_LOG"
docker restart unacos2 >> "$unacos_LOG" 2>&1
if [ $? -eq 0 ]; then
echo "$(timestamp) [SUCCESS] unacos2容器重启成功" | tee -a "$unacos_LOG"
sleep 30
else
echo "$(timestamp) [ERROR] unacos2容器重启失败" | tee -a "$unacos_LOG"
fi
fi
}
check_services() {
local problems=0
echo "===== $(timestamp) 服务状态检查 =====" | tee -a "$LOG_FILE"
# 首先检查unacos状态
if ! check_unacos_health; then
echo "$(timestamp) [WARNING] unacos2服务异常,可能会影响其他服务" | tee -a "$LOG_FILE"
fi
echo "===== $(timestamp) Java服务状态检查 =====" | tee -a "$LOG_FILE"
for service_key in "${!SERVICE_CMD_MAP[@]}"; do
if is_service_running "$service_key"; then
local pid=$(get_service_pid "$service_key")
......@@ -310,24 +296,15 @@ check_services() {
((problems++))
fi
done
restart_unacos_if_needed $problems
return $problems
}
restart_problem_services() {
local restarted=0
echo "===== $(timestamp) 服务恢复启动 =====" | tee -a "$LOG_FILE"
# 检查unacos是否正常,如果不正常先重启unacos
if ! check_unacos_health; then
echo "$(timestamp) [WARNING] unacos2服务异常,将先重启unacos2" | tee -a "$LOG_FILE"
docker restart unacos2 >> "$unacos_LOG" 2>&1
sleep 30
fi
echo "===== $(timestamp) Java服务恢复启动 =====" | tee -a "$LOG_FILE"
for service_key in "${!SERVICE_CMD_MAP[@]}"; do
if ! is_service_running "$service_key"; then
if start_service "$service_key"; then
......@@ -335,11 +312,11 @@ restart_problem_services() {
fi
fi
done
echo "$(timestamp) [SUMMARY] 已尝试重启 $restarted 个服务" | tee -a "$LOG_FILE"
}
# ========== 宿主机对外服务监测函数(新增) ==========
# ========== 宿主机对外服务监测函数 ==========
# 获取宿主机对外服务的PID
get_host_extapi_pid() {
ps aux | grep -F 'ubains-meeting-api-1.0-SNAPSHOT.jar' | grep -v grep | awk '{print $2}' | head -1
......@@ -356,9 +333,9 @@ check_host_extapi_service() {
local service_name="extapi"
local service_path="/data/services/api/java-meeting/java-meeting-extapi"
local jar_file="ubains-meeting-api-1.0-SNAPSHOT.jar"
echo "===== $(timestamp) 宿主机对外服务状态检查 =====" | tee -a "$LOG_FILE"
if is_host_extapi_running; then
local pid=$(get_host_extapi_pid)
echo "$(timestamp) [RUNNING] $service_name (PID: $pid)" | tee -a "$LOG_FILE"
......@@ -375,9 +352,9 @@ restart_host_extapi_service() {
local service_path="/data/services/api/java-meeting/java-meeting-extapi"
local jar_file="ubains-meeting-api-1.0-SNAPSHOT.jar"
local run_script="${service_path}/run.sh"
echo "$(timestamp) [START] 宿主机服务 $service_name" | tee -a "$LOG_FILE"
# 停止服务
local pid=$(get_host_extapi_pid)
if [ -n "$pid" ]; then
......@@ -385,24 +362,24 @@ restart_host_extapi_service() {
kill "$pid" 2>/dev/null && sleep 1 || kill -9 "$pid" 2>/dev/null
sleep 2
fi
# 检查启动脚本是否存在
if [ ! -f "$run_script" ]; then
echo "$(timestamp) [ERROR] 启动脚本不存在: $run_script" | tee -a "$LOG_FILE"
return 1
fi
# 启动服务
cd "$service_path" || {
echo "$(timestamp) [ERROR] 无法进入服务目录: $service_path" | tee -a "$LOG_FILE"
return 1
}
# 加载 /etc/profile 中的环境变量(包括 Java 环境变量),然后执行 run.sh
# 使用 bash -c 确保环境变量在同一 shell 中生效并传递到 run.sh
bash -c "source /etc/profile && ./run.sh" &
local start_pid=$!
# 等待服务启动
local timeout=30
while ((timeout-- > 0)); do
......@@ -413,12 +390,12 @@ restart_host_extapi_service() {
fi
sleep 1
done
echo "$(timestamp) [FAILED] $service_name 启动超时" | tee -a "$LOG_FILE"
return 1
}
# ========== 6060端口监测函数(新增) ==========
# ========== 6060端口监测函数 ==========
# 检查6060端口是否在监听
check_port_6060() {
if netstat -tuln 2>/dev/null | grep -q ':6060 ' || \
......@@ -434,25 +411,25 @@ check_port_6060() {
start_malan_service() {
local malan_path="/data/middleware/monitor"
local service_name="malan"
echo "$(timestamp) [START] 启动 $service_name 服务" | tee -a "$LOG_FILE"
# 检查目录是否存在
if [ ! -d "$malan_path" ]; then
echo "$(timestamp) [ERROR] malan目录不存在: $malan_path" | tee -a "$LOG_FILE"
return 1
fi
# 进入目录并启动malan(后台运行)
cd "$malan_path" || {
echo "$(timestamp) [ERROR] 无法进入目录: $malan_path" | tee -a "$LOG_FILE"
return 1
}
# 加载环境变量,然后启动malan
bash -c "source /etc/profile && ./malan" &
local start_pid=$!
# 等待端口启动
local timeout=30
local waited=0
......@@ -464,7 +441,7 @@ start_malan_service() {
((waited++))
sleep 1
done
echo "$(timestamp) [FAILED] $service_name 启动超时,6060端口未监听" | tee -a "$LOG_FILE"
return 1
}
......@@ -472,7 +449,7 @@ start_malan_service() {
# 检查并启动malan服务(如果需要)
check_and_start_malan() {
echo "===== $(timestamp) 6060端口状态检查 =====" | tee -a "$LOG_FILE"
if check_port_6060; then
echo "$(timestamp) [INFO] 6060端口正在监听" | tee -a "$LOG_FILE"
return 0
......@@ -483,22 +460,29 @@ check_and_start_malan() {
fi
}
# 主流程
# 1. 先检查平台API(带重试机制)
if ! check_platform_api; then
# ========== 主流程 ==========
echo "$(timestamp) [INFO] ==========================================" | tee -a "$LOG_FILE"
echo "$(timestamp) [INFO] Java服务监控脚本开始执行(容器: $JAVA_CONTAINER)" | tee -a "$LOG_FILE"
echo "$(timestamp) [INFO] ==========================================" | tee -a "$LOG_FILE"
# 1. 先检查平台API1(带重试机制)- 失败则强制重启关键服务
if ! check_platform_api "$API_URL_1" "平台API"; then
restart_critical_services
# 重启完成后继续执行后续流程
fi
# 2. 原有服务检查逻辑
# 2. 检查平台API2(带重试机制)- 失败仅记录日志
check_platform_api "$API_URL_2" "新会议配置API" || true
# 3. Java服务检查逻辑
check_services || restart_problem_services
# 3. 宿主机对外服务检查
# 4. 宿主机对外服务检查
if ! check_host_extapi_service; then
restart_host_extapi_service
fi
# 4. 6060端口监测
# 5. 6060端口监测
check_and_start_malan
echo "===== $(timestamp) 操作完成 =====" | tee -a "$LOG_FILE"
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论