提交 04c07cb7 authored 作者: 陈泽健's avatar 陈泽健

feat(server-check): 增强服务自检功能

- 重构容器信息收集逻辑,简化容器状态检查
- 新增 Redis 容器异常检测和自动修复功能
- 添加 Redis 日志导出到本地功能
- 实现 Redis 容器修复后的复检机制
- 扩展修复脚本支持 redis_container_exception 操作
- 更新上传修复脚本函数支持 Redis 异常处理
- 添加服务自检使用说明文档
- 优化代码结构和错误处理机制
上级 a68401ba
......@@ -655,3 +655,16 @@ cd /data/services/api/java-meeting/java-meeting-extapi/
- 添加DNS服务器前会检查是否已存在,避免重复配置
- 当自动处理失败时,会提供具体的手动操作指导
- 会根据检测到的网络管理器类型选择相应的服务管理方式
### 11. 修复服务器redis文件损坏问题处理
函数名称:redis_container_exception
需求说明:
修复redis容器启动异常问题
修复步骤:
1、检测新旧平台
2、重启redis查看是否正常重启成功,如果容器重启失败则往下执行第3步骤。
3、删除redis容器的data下所有数据
旧平台:
路径:/var/www/redis/data,将此目录下数据删除后重启uredis容器
新统一平台:
路径:/data/middleware/redis/data,将此目录下数据删除后重启uredis容器
\ No newline at end of file
......@@ -1985,6 +1985,121 @@ show_disk_partition_info() {
log_info "磁盘分区调整参考信息显示完成"
}
# 补充redis服务异常时修复操作
redis_container_exception() {
log_info "开始修复 redis 容器启动异常问题"
# 1. 检测平台类型(new / standard / unknown)
local platform
platform=$(detect_platform)
log_info "检测到平台类型: $platform"
# 2. 检查 docker 与 uredis 容器
if ! command -v docker >/dev/null 2>&1; then
log_error "系统中未安装 docker,无法处理 redis 容器异常"
show_operation_summary "修复 redis 容器异常" "${RED}失败${NC} (未安装 docker)"
return 1
fi
if ! docker ps -a --format '{{.Names}}' | grep -q '^uredis$'; then
log_error "未找到 uredis 容器,请确认 redis 容器已创建"
show_operation_summary "修复 redis 容器异常" "${RED}失败${NC} (未找到 uredis 容器)"
return 1
fi
# 3. 先尝试正常重启 uredis 容器
log_info "尝试重启 uredis 容器..."
if docker restart uredis >/dev/null 2>&1; then
sleep 5
if docker ps --format '{{.Names}}' | grep -q '^uredis$'; then
log_info "uredis 容器重启成功,无需清理数据"
show_operation_summary "修复 redis 容器异常" "${GREEN}完成${NC} (容器重启成功)"
return 0
else
log_warn "uredis 容器重启后未处于运行状态,将按 PRD 执行数据清理流程"
fi
else
log_warn "直接重启 uredis 容器失败,将按 PRD 执行数据清理流程"
fi
# 4. 确定 redis data 目录(按平台分支)
local redis_data_dir=""
if [ "$platform" = "new" ]; then
redis_data_dir="/data/middleware/redis/data"
elif [ "$platform" = "standard" ]; then
redis_data_dir="/var/www/redis/data"
else
# 未识别平台时,根据目录存在性猜测
if [ -d "/data/middleware/redis/data" ]; then
redis_data_dir="/data/middleware/redis/data"
log_warn "平台类型 unknown,使用新平台 redis data 目录: $redis_data_dir"
elif [ -d "/var/www/redis/data" ]; then
redis_data_dir="/var/www/redis/data"
log_warn "平台类型 unknown,使用旧平台 redis data 目录: $redis_data_dir"
else
log_error "无法确定 redis data 目录,请确认平台及目录结构"
show_operation_summary "修复 redis 容器异常" "${RED}失败${NC} (未找到 redis data 目录)"
return 1
fi
fi
log_info "将使用 redis data 目录: $redis_data_dir"
if [ ! -d "$redis_data_dir" ]; then
log_error "redis data 目录不存在: $redis_data_dir"
show_operation_summary "修复 redis 容器异常" "${RED}失败${NC} (redis data 目录不存在)"
return 1
fi
# 5. 确认是否清空 redis data 目录(支持非交互)
local do_clear_data=false
log_warn "准备删除 redis data 目录下所有数据,这将清空当前 redis 数据。"
log_info "目录: $redis_data_dir"
if [ "$NON_INTERACTIVE" = "1" ] && [ "$ASSUME_YES" = "1" ]; then
log_info "非交互模式,自动确认清空 redis data 目录"
do_clear_data=true
else
if confirm_action "是否确认删除该目录下所有数据并重新启动 uredis 容器?"; then
do_clear_data=true
else
log_info "用户取消删除 redis data 数据"
fi
fi
if [ "$do_clear_data" != true ]; then
show_operation_summary "修复 redis 容器异常" "${YELLOW}取消${NC} (用户取消删除数据)"
return 0
fi
# 6. 停止容器并清空数据目录
log_info "停止 uredis 容器..."
docker stop uredis >/dev/null 2>&1 || log_warn "停止 uredis 容器失败,可能已停止"
log_info "清空 redis data 目录内容: $redis_data_dir"
# 防止变量为空导致 rm -rf / 等危险:加 :? 保护
rm -rf "${redis_data_dir:?}/"* "${redis_data_dir:?}"/.[!.]* "${redis_data_dir:?}"/..?* 2>/dev/null || true
# 7. 重启 uredis 容器
log_info "重新启动 uredis 容器..."
if docker start uredis >/dev/null 2>&1; then
sleep 5
if docker ps --format '{{.Names}}' | grep -q '^uredis$'; then
log_info "uredis 容器已在清空数据后成功启动"
show_operation_summary "修复 redis 容器异常" "${GREEN}完成${NC} (已清空 data 并重启 uredis)"
return 0
else
log_error "清空数据后 uredis 容器仍未处于运行状态,请检查容器日志"
show_operation_summary "修复 redis 容器异常" "${RED}失败${NC} (清空 data 后容器仍未运行)"
return 1
fi
else
log_error "清空数据后启动 uredis 容器失败,请检查 docker / 容器配置"
show_operation_summary "修复 redis 容器异常" "${RED}失败${NC} (docker start uredis 失败)"
return 1
fi
}
# 动作分发:根据动作名调用对应函数(必要时传入平台)
run_action_by_name() {
local action="$1"
......@@ -2033,6 +2148,9 @@ run_action_by_name() {
fix_dns_config)
fix_dns_config "$platform"
;;
redis_container_exception)
redis_container_exception
;;
# 备份
backup_environment_data|backup_env)
......
......@@ -88,7 +88,7 @@
tcp 0 0 0.0.0.0:8002 0.0.0.0:* LISTEN 14/httpd
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 105/memcached
tcp6 0 0 :::11211 :::* LISTEN 105/memcached
##### 5、DNS解析问题(✅ 已实现):
检测目标服务器的DNS配置,能否正常进行解析等相关操作,解析异常则进行远程修复操作,参考NTP远程修复,不需要判断传统或是新统一平台。
......@@ -244,11 +244,30 @@
2、数据库备份,账号为root,密码为dNrprU&2S,数据库容器是umysql容器,数据库是ubains和devops,数据库备份完成后也复制到/home/bakup目录下
最后将/home/bakup目录压缩成tar.gz格式文件并导出,文件命名补充时间戳,导出完成后清理/home目录下的这个备份文件。
##### 12、容器信息收集(✅ 已实现):
函数名称:Test-ContainerInformation
查询当前服务器上所有容器信息(包含未运行与运行中的信息),可以通过docker inspect来获取MAC地址、端口映射信息、启动文件位置。
信息打印排版:先打印运行中的容器信息,再打印未运行的容器信息。在容器信息打印之间增加分隔线。
需求描述:
查询当前服务器上所有容器信息(包含未运行与运行中的信息),可以通过docker inspect来获取MAC地址、端口映射信息、启动文件位置。
信息打印排版:先打印运行中的容器信息,再打印未运行的容器信息。在容器信息打印之间增加分隔线。
容器异常:
Redis容器:
1、日志获取:
检测
新统一平台:
路径:/data/middleware/redis/data/redis.log
传统平台:
路径:/var/www/redis/data/redis.log
将上述redis.log文件从目标服务器导出到本地自检结果目录中(例如logs/redis/子目录),并在自检日志中记录导出结果。
2、异常判定:
如果 uredis 容器未运行,并且没有其他名字中包含“redis”的运行中容器,则判定为 Redis 容器异常。
3、远端修复操作:
调用上传修复脚本函数 Upload_the_repair_script,将当前目录下的issue_handler.sh脚本上传到目标服务器,并执行其中的 redis_container_exception 修复函数。
调用示例(逻辑示意):
./issue_handler.sh --action redis_container_exception --non-interactive --yes
4、修复完成后的复检:
修复脚本执行完成后,再次检查 uredis 容器状态:
- 如果 uredis 已处于运行状态,记录“Redis容器复检成功”到自检日志和md报告中;
- 如果 uredis 仍未运行,则记录“Redis容器复检失败,需要人工排查”到自检日志和md报告中。
##### 13、定时任务查询(待实现):
函数名称:Test-ScheduledTask
......@@ -260,8 +279,7 @@
公有:
- 0 13 * * * bash /usr/local/docker/UbainsmysqlBakUp.sh
ujava存在:
-
-
##### 14、上传修复脚本(已实现NTP和防火墙修复):
函数名称:Upload_the_repair_script
......
## 服务自检脚本使用说明
### 1、将整个Server_health_check文件夹拷贝到桌面
### 2、打开电脑的powershell
### 3、切换到Server_health_check文件夹路径
### 4、执行指令
Unblock-File -Path "C:\Users\UBAINS\Desktop\Sever_health_check\check_server_health.ps1"(后面路径替换成自己电脑上的路径!!!)
### 5、执行指令
.\check_server_health.ps1
### 6、步骤说明:
#### 6.1、服务器信息录入
根据提示输入0,再依次输入服务器IP地址、22端口、账号、密码信息即可。
#### 6.2、
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论