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

fix(server): 解决对外服务进程检测和修复问题

- 修复了外部会议服务进程检测逻辑,支持通过 Pattern 或 Service 字段匹配
- 改进了 PowerShell 脚本中服务器对象传递方式,从 pscustomobject 改为 hashtable
- 统一了新旧平台对外服务修复结果的报告格式
- 优化了 issue_handler.sh 中的 Java 环境检测和 PATH 配置
- 移除了启动脚本中的冗余 source /etc/profile 命令
- 添加了非交互模式下的自动修复执行支持
上级 fecc850c
......@@ -489,7 +489,6 @@ resize2fs: Bad magic number in super-block 当尝试打开 /dev/mapper/centos-ro
标准版平台-对外后端服务启动,同时判断/etc/profile里面是否存在,不存在则添加。
```bash
source /etc/profile
cd /var/www/java/external-meeting-api/
./run.sh
```
......@@ -497,7 +496,6 @@ cd /var/www/java/external-meeting-api/
新统一平台-对外后端服务启动,同时判断/etc/profile里面是否存在,不存在则添加。
```bash
source /etc/profile
cd /data/services/api/java-meeting/java-meeting-extapi/
./run.sh
```
......
......@@ -1103,51 +1103,93 @@ export_and_compress_logs() {
fix_external_service_disconnect() {
local platform=$1
local work_dir=""
log_info "开始修复对外后端服务异常掉线,平台类型: $platform"
# 1. 根据平台确定工作目录
if [ "$platform" = "new" ]; then
work_dir="/data/services/api/java-meeting/java-meeting-extapi/"
else
work_dir="/var/www/java/external-meeting-api/"
fi
log_info "工作目录: $work_dir"
# 检查profile中是否包含source命令
local profile_path="/etc/profile"
local source_line="source /etc/profile"
if [ -f "$profile_path" ]; then
if ! grep -q "^$source_line$" "$profile_path"; then
if confirm_action "/etc/profile中未找到source命令,是否添加?"; then
log_info "用户确认添加source命令"
echo "$source_line" >> "$profile_path"
log_info "已在/etc/profile中添加source命令"
else
log_info "用户取消添加source命令"
fi
if [ ! -d "$work_dir" ]; then
log_error "工作目录不存在: $work_dir,无法执行修复"
show_operation_summary "修复对外后端服务异常掉线" "${RED}失败${NC} (工作目录不存在: $work_dir)"
return 1
fi
# 3. 显式加载 profile,确保 java 在 PATH 中(新增)
if [ -f /etc/profile ]; then
# 使用 . 而不是 source 以兼容 /bin/sh
. /etc/profile
log_info "已在脚本中执行: . /etc/profile"
fi
# 再检查一次 java 是否可用
if ! command -v java >/dev/null 2>&1; then
log_error "在当前非交互环境中未找到 java 命令,请检查 PATH/JAVA_HOME 配置"
log_error "当前 PATH: $PATH"
show_operation_summary "修复对外后端服务异常掉线" "${RED}失败${NC} (当前环境无法找到 java 命令)"
return 1
else
log_info "检测到 java 命令: $(command -v java)"
fi
# 4. 执行 run.sh 启动对外服务(你原来的第 3 步)
local run_script="${work_dir}/run.sh"
if [ ! -x "$run_script" ]; then
if [ -f "$run_script" ]; then
log_warn "run.sh 不可执行,尝试赋予执行权限: $run_script"
chmod +x "$run_script" || {
log_error "无法为 run.sh 赋权执行: $run_script"
show_operation_summary "修复对外后端服务异常掉线" "${RED}失败${NC} (run.sh 无执行权限且赋权失败)"
return 1
}
else
log_info "/etc/profile中已包含source命令"
log_error "run.sh 脚本不存在: $run_script"
show_operation_summary "修复对外后端服务异常掉线" "${RED}失败${NC} (run.sh 不存在)"
return 1
fi
fi
if [ "$NON_INTERACTIVE" = "1" ] && [ "$ASSUME_YES" = "1" ]; then
log_info "非交互模式,自动执行: cd $work_dir && ./run.sh"
else
log_warn "配置文件不存在: $profile_path"
if ! confirm_action "是否启动对外后端服务 $work_dir?"; then
log_info "用户取消启动对外后端服务"
show_operation_summary "修复对外后端服务异常掉线" "${YELLOW}取消${NC} (用户取消启动服务)"
return 0
fi
fi
# 启动服务
if confirm_action "是否启动对外后端服务 $work_dir?"; then
log_info "用户确认启动对外后端服务"
if [ -d "$work_dir" ]; then
(cd "$work_dir" && ./run.sh)
log_info "已启动对外后端服务: $work_dir"
cd "$work_dir" || {
log_error "无法进入工作目录: $work_dir"
show_operation_summary "修复对外后端服务异常掉线" "${RED}失败${NC} (cd $work_dir 失败)"
return 1
}
log_info "执行启动脚本: ./run.sh"
if ./run.sh >> "$LOG_FILE" 2>&1; then
log_info "run.sh 执行完成,等待 60 秒检查服务状态..."
sleep 60
# 5. 简单检查进程是否已启动
if pgrep -f "ubains-meeting-api-1.0-SNAPSHOT.jar" >/dev/null 2>&1; then
log_info "对外后端服务进程已检测到: ubains-meeting-api-1.0-SNAPSHOT.jar"
show_operation_summary "修复对外后端服务异常掉线" "${GREEN}完成${NC} (服务进程已启动)"
return 0
else
log_error "工作目录不存在: $work_dir"
log_warn "run.sh 执行后仍未检测到 ubains-meeting-api-1.0-SNAPSHOT.jar 进程"
show_operation_summary "修复对外后端服务异常掉线" "${YELLOW}完成${NC} (脚本已执行,但未检测到进程)"
return 1
fi
else
log_info "用户取消启动对外后端服务"
log_error "run.sh 执行失败,请检查日志: $LOG_FILE"
show_operation_summary "修复对外后端服务异常掉线" "${RED}失败${NC} (run.sh 执行失败)"
return 1
fi
log_info "修复对外后端服务异常掉线完成"
}
# 修复ntp服务配置
......
......@@ -1440,17 +1440,13 @@ printf "%d,%d,%d\n" "$tot_gb" "$use_gb" "$pct"
function Repair-ExternalMeetingService {
param(
[Parameter(Mandatory = $true)]
[pscustomobject]$Server
[hashtable]$Server
)
Write-Log -Level "INFO" -Message "[EXT] 触发远端修复: ./issue_handler.sh --action fix_external_service_disconnect"
$serverForRepair = [pscustomobject]@{
IP = $Server.IP
User = $Server.User
Pass = $Server.Pass
Port = $Server.Port
}
# 这里直接使用传入的 hashtable,不再转成 pscustomobject
$serverForRepair = $Server
try {
# 调用上传+执行修复脚本(与 NTP、防火墙相同模式)
......@@ -2051,11 +2047,12 @@ function Show-HealthReport {
Write-Host ""
}
# 传统平台对外服务远程修复结果
if ($PlatformType -eq 'old' -and $global:ExternalServiceRepairResult) {
# 对外服务远程修复结果(新统一平台/传统平台通用)
if ($global:ExternalServiceRepairResult) {
$r = $global:ExternalServiceRepairResult
$icon = if ($r.Success) { "✅" } else { "⚠️" }
$md += "## 传统平台对外服务远程修复结果"
$platformLabel = if ($PlatformType -eq 'new') { '新统一平台' } else { '传统平台' }
$md += "## $platformLabel 对外服务远程修复结果"
$md += "- $icon 对外服务 (external-meeting-api)"
$md += " - 已触发修复: $($r.Attempted)"
$md += " - 修复结果: $(if ($r.Success) { '成功' } else { '失败' })"
......@@ -2811,6 +2808,10 @@ function Upload_the_repair_script {
$extraArgs = ""
if ($Action -eq "fix_ntp_config") { $extraArgs = "--ntp-auto" }
elseif ($Action -eq "fix_port_access") { $extraArgs = "--non-interactive --yes" }
elseif ($Action -eq "fix_external_service_disconnect") {
# 对外服务修复同样走非交互 + 默认 yes
$extraArgs = "--non-interactive --yes"
}
$execCmd = @("set -e","cd '$RemoteDir'","./issue_handler.sh --action $Action $platArg $extraArgs") -join " && "
Write-Log -Level "INFO" -Message "开始执行远端修复: $execCmd"
......@@ -3016,6 +3017,22 @@ function Main {
$ujavaContainerResults = Test-UjavaServices -Server $server -ContainerName $systemInfo.UjavaContainer -PlatformType $platformType
# 检测宿主机服务(extapi)
$ujavaHostResults = Test-UjavaHostServices -Server $server
# 如果检测到对外服务进程 ubains-meeting-api-1.0-SNAPSHOT.jar 未运行,则触发远程修复(新统一平台)
$global:ExternalServiceRepairResult = $null # 供报告使用
if ($ujavaHostResults -and $ujavaHostResults.Count -gt 0) {
# 根据 Pattern 字段匹配具体 jar 名,或者使用 Service -eq 'extapi'
$extSvc = $ujavaHostResults | Where-Object { $_.Pattern -eq 'ubains-meeting-api-1.0-SNAPSHOT.jar' }
if (-not $extSvc) {
# 兼容:按 Service 名称退回一档
$extSvc = $ujavaHostResults | Where-Object { $_.Service -eq 'extapi' }
}
if ($extSvc -and -not $extSvc.Running) {
Write-Log -Level "WARN" -Message "[EXT] 检测到对外服务进程未运行,准备执行远程修复 (fix_external_service_disconnect)"
$global:ExternalServiceRepairResult = Repair-ExternalMeetingService -Server $server
}
}
}
else {
# 如果没有检测到ujava容器,尝试在宿主机检测(可能是传统部署方式)
......@@ -3052,7 +3069,13 @@ function Main {
# 如果检测到对外服务进程 ubains-meeting-api-1.0-SNAPSHOT.jar 未运行,则触发远程修复
$global:ExternalServiceRepairResult = $null # 供报告使用
if ($ujavaHostResults -and $ujavaHostResults.Count -gt 0) {
$extSvc = $ujavaHostResults | Where-Object { $_.Service -match 'ubains-meeting-api-1\.0-SNAPSHOT\.jar' }
# 根据 Pattern 字段匹配具体 jar 名,或者使用 Service -eq 'extapi'
$extSvc = $ujavaHostResults | Where-Object { $_.Pattern -eq 'ubains-meeting-api-1.0-SNAPSHOT.jar' }
if (-not $extSvc) {
# 兼容:按 Service 名称退回一档
$extSvc = $ujavaHostResults | Where-Object { $_.Service -eq 'extapi' }
}
if ($extSvc -and -not $extSvc.Running) {
Write-Log -Level "WARN" -Message "[EXT] 检测到对外服务进程未运行,准备执行远程修复 (fix_external_service_disconnect)"
$global:ExternalServiceRepairResult = Repair-ExternalMeetingService -Server $server
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论