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

feat(service-inspection): 实现服务自检模块Shell脚本转换与混合架构,处理arm架构部署脚本中重复代码以及路径错误问题

- 更新需求文档,采用主脚本保持PowerShell、检测模块转换为Shell的设计
- 添加Shell脚本调用函数,支持上传并在Linux服务器执行Shell检测脚本
- 实现common.sh基础函数库,提供日志、Docker操作、进程检测等功能
- 开发docker_check.sh容器检测脚本,支持JSON格式输出检测结果
- 删除自动化部署脚本中的MySQL备份脚本相关逻辑
- 更新Redis安装脚本中镜像文件路径配置
上级 027ae153
...@@ -402,6 +402,76 @@ function Get-UjavaSystemVariant { ...@@ -402,6 +402,76 @@ function Get-UjavaSystemVariant {
return "meeting" return "meeting"
} }
# ================================
# Shell脚本调用函数(混合架构支持)
# ================================
# 上传Shell脚本到远程服务器
function Upload-ShellScript {
param(
[Parameter(Mandatory=$true)] [hashtable]$Server,
[Parameter(Mandatory=$true)] [string]$ScriptName,
[Parameter(Mandatory=$false)] [string]$RemotePath = "/tmp/health_check"
)
# 创建远程临时目录
$cmd = "mkdir -p $RemotePath"
Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $cmd | Out-Null
# 上传基础函数库
$localCommonPath = Join-Path $SCRIPT_DIR "lib\shell\common.sh"
$remoteCommonPath = "$RemotePath/common.sh"
Copy-File-To-Remote -Server $Server -LocalPath $localCommonPath -RemotePath $remoteCommonPath
# 上传检测脚本
$localScriptPath = Join-Path $SCRIPT_DIR "lib\shell\$ScriptName"
$remoteScriptPath = "$RemotePath/$ScriptName"
Copy-File-To-Remote -Server $Server -LocalPath $localScriptPath -RemotePath $remoteScriptPath
return $remoteScriptPath
}
# 执行远程Shell脚本
function Invoke-RemoteShellCheck {
param(
[Parameter(Mandatory=$true)] [hashtable]$Server,
[Parameter(Mandatory=$true)] [string]$ScriptName,
[Parameter(Mandatory=$false)] [string]$Arguments = "",
[Parameter(Mandatory=$false)] [string]$RemotePath = "/tmp/health_check"
)
# 上传脚本
$remoteScriptPath = Upload-ShellScript -Server $Server -ScriptName $ScriptName -RemotePath $RemotePath
# 执行脚本
$cmd = "cd $RemotePath && chmod +x common.sh $ScriptName && ./$ScriptName $Arguments"
$result = Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $cmd
# 清理临时文件
Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command "rm -rf $RemotePath" | Out-Null
# 返回结果
return $result.Output -join "`n"
}
# 解析Shell脚本JSON结果
function ConvertFrom-ShellJson {
param(
[Parameter(Mandatory=$true)] [string]$JsonString
)
try {
# 移除可能的非JSON字符
$cleanJson = $JsonString -replace '[^\x00-\x7F]', ''
return $cleanJson | ConvertFrom-Json
}
catch {
Write-Log -Level "ERROR" -Message "[SHELL] JSON解析失败: $($_.Exception.Message)"
return $null
}
}
# ================================ # ================================
# 检查依赖 # 检查依赖
# ================================ # ================================
......
#!/bin/bash
# ==============================================================================
# common.sh
# ------------------------------------------------------------------------------
# Shell基础函数库
#
# .SYNOPSIS
# 提供所有Shell脚本共享的基础函数
#
# .DESCRIPTION
# 本模块包含跨Shell脚本共享的基础函数,包括:
# - 日志输出函数
# - Docker命令执行
# - 进程检测
# - JSON输出辅助
#
# .NOTES
# 版本:1.0.0
# 创建日期:2026-05-13
#
# ==============================================================================
# ================================
# 日志函数
# ================================
# 输出INFO级别日志
log_info() {
local msg="$1"
echo "[INFO] $msg"
}
# 输出ERROR级别日志
log_error() {
local msg="$1"
echo "[ERROR] $msg"
}
# 输出WARN级别日志
log_warn() {
local msg="$1"
echo "[WARN] $msg"
}
# 输出SUCCESS级别日志
log_success() {
local msg="$1"
echo "[SUCCESS] $msg"
}
# ================================
# Docker命令执行函数
# ================================
# 在Docker容器内执行命令
# 参数: $1=容器名, $2=命令
docker_exec() {
local container="$1"
local cmd="$2"
if [ -z "$container" ] || [ -z "$cmd" ]; then
return 1
fi
docker exec "$container" sh -c "$cmd" 2>/dev/null
return $?
}
# 检查容器是否存在
# 参数: $1=容器名
docker_container_exists() {
local container="$1"
local count=$(docker ps -a --filter "name=${container}" --format "{{.Names}}" 2>/dev/null | grep -c "^${container}$")
echo $count
}
# ================================
# 进程检测函数
# ================================
# 检测进程数量(根据jar文件名)
# 参数: $1=进程匹配模式, $2=额外过滤条件(可选)
check_process_count() {
local pattern="$1"
local filter="$2"
if [ -z "$pattern" ]; then
echo 0
return
fi
local count=0
if [ -n "$filter" ]; then
count=$(ps aux 2>/dev/null | grep -v grep | grep "$pattern" | grep "$filter" | wc -l)
else
count=$(ps aux 2>/dev/null | grep -v grep | grep "$pattern" | wc -l)
fi
echo $count
}
# ================================
# JSON输出辅助函数
# ================================
# 输出JSON键值对
# 参数: $1=键名, $2=值, $3=是否最后一个(可选)
json_kv() {
local key="$1"
local value="$2"
local is_last="${3:-false}"
if [ "$is_last" = "true" ]; then
echo " \"$key\": \"$value\""
else
echo " \"$key\": \"$value\","
fi
}
# 输出JSON数组开始
# 参数: $1=数组名
json_array_start() {
local name="$1"
echo " \"$name\": ["
}
# 输出JSON数组元素
# 参数: $1=元素内容, $2=是否最后一个
json_array_item() {
local item="$1"
local is_last="${2:-false}"
if [ "$is_last" = "true" ]; then
echo " $item"
else
echo " $item,"
fi
}
# 输出JSON数组结束
json_array_end() {
echo " ]"
}
# ================================
# 检测结果辅助函数
# ================================
# 生成服务检测状态
# 参数: $1=进程数量
get_service_status() {
local count="$1"
if [ "$count" -gt 0 ]; then
echo "运行中"
else
echo "未运行"
fi
}
# 生成检测状态图标
# 参数: $1=进程数量
get_status_icon() {
local count="$1"
if [ "$count" -gt 0 ]; then
echo "[OK]"
else
echo "[FAIL]"
fi
}
# ================================
# 平台检测函数
# ================================
# 检测是否为新统一平台
check_new_platform() {
if [ -d "/data/services" ]; then
echo "new"
else
echo "old"
fi
}
# 检测ujava容器名称
detect_ujava_container() {
# 新统一平台
if [ -d "/data/services" ]; then
echo "ujava2"
# 传统平台
elif [ -d "/var/www/java/unifiedPlatform" ]; then
echo "ujava"
else
echo "ujava"
fi
}
# ================================
# 端口检测函数
# ================================
# 检测端口是否在监听
# 参数: $1=端口号
check_port_listen() {
local port="$1"
local count=$(netstat -tln 2>/dev/null | grep -c ":${port} ")
if [ -z "$count" ]; then
count=$(ss -tln 2>/dev/null | grep -c ":${port} ")
fi
echo ${count:-0}
}
# 检测端口对应的进程
# 参数: $1=端口号
check_port_process() {
local port="$1"
local pid=$(netstat -tlnp 2>/dev/null | grep ":${port} " | head -1 | awk '{print $7}' | cut -d'/' -f1)
if [ -z "$pid" ]; then
pid=$(ss -tlnp 2>/dev/null | grep ":${port} " | head -1 | grep -oP 'pid=\K\d+')
fi
echo ${pid:-"N/A"}
}
# ================================
# 文件检测函数
# ================================
# 检测文件权限
# 参数: $1=文件路径
check_file_permission() {
local filepath="$1"
if [ -e "$filepath" ]; then
ls -l "$filepath" 2>/dev/null | awk '{print $1, $3, $4, $5, $6, $7, $8, $9}'
return 0
else
echo "MISS"
return 1
fi
}
# 检测文件是否存在并可执行
# 参数: $1=文件路径
check_file_executable() {
local filepath="$1"
if [ -x "$filepath" ]; then
echo "yes"
return 0
else
echo "no"
return 1
fi
}
# ================================
# 系统信息函数
# ================================
# 获取系统版本
get_system_version() {
if [ -f /etc/redhat-release ]; then
cat /etc/redhat-release
elif [ -f /etc/os-release ]; then
grep PRETTY_NAME /etc/os-release | cut -d'"' -f2
else
uname -sr
fi
}
# 获取系统架构
get_system_arch() {
uname -m
}
# 获取CPU核心数
get_cpu_cores() {
nproc
}
# 获取总内存(MB)
get_total_memory() {
local mem_kb=$(grep MemTotal /proc/meminfo | awk '{print $2}')
echo $((mem_kb / 1024))
}
# 获取可用内存(MB)
get_available_memory() {
local mem_kb=$(grep MemAvailable /proc/meminfo | awk '{print $2}')
if [ -z "$mem_kb" ]; then
local mem_total=$(grep MemTotal /proc/meminfo | awk '{print $2}')
local mem_free=$(grep MemFree /proc/meminfo | awk '{print $2}')
local mem_buffers=$(grep Buffers /proc/meminfo | awk '{print $2}')
local mem_cached=$(grep ^Cached /proc/meminfo | awk '{print $2}')
mem_kb=$((mem_free + mem_buffers + mem_cached))
fi
echo $((mem_kb / 1024))
}
#!/bin/bash
# ==============================================================================
# docker_check.sh
# ------------------------------------------------------------------------------
# Docker容器检测Shell脚本
#
# .SYNOPSIS
# 检测Docker容器运行状态
#
# .DESCRIPTION
# 检测Docker服务的运行状态、容器列表、资源使用等。
#
# .PARAMETERS
# --format 输出格式(json/text,默认json)
# --detail 详细程度(basic/full,默认basic)
#
# .EXAMPLE
# ./docker_check.sh
# ./docker_check.sh --format text --detail full
#
# .OUTPUTS
# JSON格式检测结果
#
# .NOTES
# 版本:1.0.0
# 创建日期:2026-05-13
#
# ==============================================================================
# 加载基础函数库
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/common.sh"
# ================================
# 参数解析
# ================================
OUTPUT_FORMAT="json"
DETAIL_LEVEL="basic"
while [[ $# -gt 0 ]]; do
case $1 in
--format)
OUTPUT_FORMAT="$2"
shift 2
;;
--detail)
DETAIL_LEVEL="$2"
shift 2
;;
*)
shift
;;
esac
done
# ================================
# 检测函数
# ================================
# 检测Docker服务状态
check_docker_service() {
if command -v docker &> /dev/null; then
echo "running"
else
echo "not_installed"
fi
}
# 检测Docker容器列表
check_containers() {
docker ps -a --format "{{.Names}}|{{.Status}}|{{.Image}}" 2>/dev/null
}
# 检测特定容器状态
# 参数: $1=容器名
check_container_status() {
local container="$1"
local status=$(docker inspect --format='{{.State.Status}}' "$container" 2>/dev/null)
if [ -n "$status" ]; then
echo "$status"
else
echo "not_found"
fi
}
# 检测容器资源使用
# 参数: $1=容器名
check_container_resources() {
local container="$1"
local stats=$(docker stats --no-stream --format "{{.CPUPerc}},{{.MemUsage}},{{.NetIO}}" "$container" 2>/dev/null)
echo "$stats"
}
# ================================
# 输出函数
# ================================
# 输出JSON格式结果
output_json() {
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
local docker_status=$(check_docker_service)
echo "{"
json_kv "check_type" "docker_check"
json_kv "docker_service" "$docker_status"
json_kv "timestamp" "$timestamp" false
if [ "$docker_status" = "running" ]; then
json_array_start "containers"
local containers=$(check_containers)
local first=true
local total=0
local running=0
while IFS= read -r line; do
[ -z "$line" ] && continue
total=$((total + 1))
IFS='|' read -r name status image <<< "$line"
if [[ "$status" == Up* ]]; then
running=$((running + 1))
fi
if [ "$first" = true ]; then
first=false
else
echo ","
fi
# 解析状态
local state="stopped"
if [[ "$status" == Up* ]]; then
state="running"
fi
echo -n " {"
echo -n "\"name\": \"$name\", "
echo -n "\"image\": \"$image\", "
echo -n "\"state\": \"$state\", "
echo -n "\"status\": \"$status\""
if [ "$DETAIL_LEVEL" = "full" ]; then
local resources=$(check_container_resources "$name")
IFS=',' read -r cpu mem netio <<< "$resources"
echo -n ", \"cpu\": \"$cpu\", \"memory\": \"$mem\", \"network\": \"$netio\""
fi
echo -n "}"
done <<< "$containers"
echo ""
json_array_end
# 添加汇总信息
echo ","
echo " \"summary\": {"
echo " \"total\": $total,"
echo " \"running\": $running,"
echo " \"stopped\": $((total - running))"
echo " }"
fi
echo "}"
}
# 输出文本格式结果
output_text() {
local docker_status=$(check_docker_service)
echo "========== Docker容器检测 =========="
echo "Docker服务状态: $docker_status"
echo ""
if [ "$docker_status" = "running" ]; then
local containers=$(check_containers)
local total=0
local running=0
while IFS= read -r line; do
[ -z "$line" ] && continue
total=$((total + 1))
IFS='|' read -r name status image <<< "$line"
if [[ "$status" == Up* ]]; then
running=$((running + 1))
echo " [RUN] $name - $image"
else
echo " [STOP] $name - $image"
fi
if [ "$DETAIL_LEVEL" = "full" ]; then
echo " 状态: $status"
local resources=$(check_container_resources "$name")
IFS=',' read -r cpu mem netio <<< "$resources"
echo " 资源: CPU=$cpu, 内存=$mem, 网络=$netio"
fi
done <<< "$containers"
echo ""
echo "汇总: 总计 $total 个容器,运行中 $running 个,已停止 $((total - running)) 个"
fi
echo ""
echo "========== 检测完成 =========="
}
# ================================
# 主函数
# ================================
main() {
if [ "$OUTPUT_FORMAT" = "text" ]; then
output_text
else
output_json
fi
}
# 执行主函数
main
#!/bin/bash
# ==============================================================================
# java_check.sh
# ------------------------------------------------------------------------------
# Java服务检测Shell脚本
#
# .SYNOPSIS
# 检测Java服务进程运行状态
#
# .DESCRIPTION
# 通过SSH调用此脚本检测ujava容器内外或宿主机的Java服务状态。
# 支持新统一平台和传统平台两种部署方式。
#
# .PARAMETERS
# --container 容器名称(可选,为空则在宿主机检测)
# --platform 平台类型(new/old)
# --format 输出格式(json/text,默认json)
#
# .EXAMPLE
# ./java_check.sh --container ujava2 --platform new
# ./java_check.sh --platform old --format text
#
# .OUTPUTS
# JSON格式检测结果
#
# .NOTES
# 版本:1.0.0
# 创建日期:2026-05-13
#
# ==============================================================================
# 加载基础函数库
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/common.sh"
# ================================
# 配置变量
# ================================
# Java服务配置(关联数组)
declare -A JAVA_SERVICES
JAVA_SERVICES["auth"]="ubains-auth.jar"
JAVA_SERVICES["gateway"]="ubains-gateway.jar"
JAVA_SERVICES["system"]="ubains-modules-system.jar"
JAVA_SERVICES["meeting2.0"]="ubains-meeting-inner-api-1.0-SNAPSHOT.jar"
JAVA_SERVICES["meeting3.0"]="ubains-meeting-inner-api-1.0-SNAPSHOT.jar"
JAVA_SERVICES["mqtt"]="ubains-meeting-mqtt-1.0-SNAPSHOT.jar"
JAVA_SERVICES["quartz"]="ubains-meeting-quartz-1.0-SNAPSHOT.jar"
JAVA_SERVICES["message"]="ubains-meeting-message-scheduling-1.0-SNAPSHOT.jar"
# 新统一平台Java服务路径
NEW_PLATFORM_PATH_PREFIX="/data/services/api"
# ================================
# 参数解析
# ================================
CONTAINER=""
PLATFORM="new"
OUTPUT_FORMAT="json"
while [[ $# -gt 0 ]]; do
case $1 in
--container)
CONTAINER="$2"
shift 2
;;
--platform)
PLATFORM="$2"
shift 2
;;
--format)
OUTPUT_FORMAT="$2"
shift 2
;;
*)
shift
;;
esac
done
# ================================
# 检测函数
# ================================
# 检测单个Java服务
# 参数: $1=服务名, $2=jar文件名
check_java_service() {
local service_name="$1"
local jar_file="$2"
local count=0
local status="未运行"
local location="宿主机"
if [ -n "$CONTAINER" ]; then
# 容器内检测
location="容器内"
# meeting2.0和meeting3.0需要额外路径过滤
if [ "$service_name" = "meeting2.0" ]; then
count=$(docker_exec "$CONTAINER" "ps aux | grep -v grep | grep '$jar_file' | grep 'java-meeting2.0' | wc -l")
elif [ "$service_name" = "meeting3.0" ]; then
count=$(docker_exec "$CONTAINER" "ps aux | grep -v grep | grep '$jar_file' | grep 'java-meeting3.0' | wc -l")
else
count=$(docker_exec "$CONTAINER" "ps aux | grep -v grep | grep '$jar_file' | wc -l")
fi
else
# 宿主机检测
if [ "$service_name" = "meeting2.0" ]; then
count=$(check_process_count "$jar_file" "java-meeting2.0")
elif [ "$service_name" = "meeting3.0" ]; then
count=$(check_process_count "$jar_file" "java-meeting3.0")
else
count=$(check_process_count "$jar_file")
fi
fi
if [ "$count" -gt 0 ]; then
status="运行中"
fi
echo "$service_name|$jar_file|$status|$count|$location"
}
# ================================
# 输出函数
# ================================
# 输出JSON格式结果
output_json() {
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "{"
json_kv "check_type" "java_service"
json_kv "container" "$CONTAINER"
json_kv "platform" "$PLATFORM"
json_kv "timestamp" "$timestamp" false
json_array_start "services"
local first=true
local service_names=("auth" "gateway" "system" "meeting2.0" "meeting3.0" "mqtt" "quartz" "message")
for svc in "${service_names[@]}"; do
local jar_file="${JAVA_SERVICES[$svc]}"
local result=$(check_java_service "$svc" "$jar_file")
IFS='|' read -r name jar status count location <<< "$result"
if [ "$first" = true ]; then
first=false
else
echo ","
fi
echo -n " {"
echo -n "\"name\": \"$name\", "
echo -n "\"jar\": \"$jar\", "
echo -n "\"status\": \"$status\", "
echo -n "\"count\": $count, "
echo -n "\"location\": \"$location\""
echo -n "}"
done
echo ""
json_array_end
echo "}"
}
# 输出文本格式结果
output_text() {
local location_str=""
if [ -n "$CONTAINER" ]; then
location_str=" (容器: $CONTAINER)"
fi
echo "========== Java服务检测${location_str} =========="
echo "平台类型: $PLATFORM"
echo ""
local service_names=("auth" "gateway" "system" "meeting2.0" "meeting3.0" "mqtt" "quartz" "message")
for svc in "${service_names[@]}"; do
local jar_file="${JAVA_SERVICES[$svc]}"
local result=$(check_java_service "$svc" "$jar_file")
IFS='|' read -r name jar status count location <<< "$result"
local icon=$(get_status_icon "$count")
echo " $icon $name ($jar) [$location]: $status"
done
echo ""
echo "========== 检测完成 =========="
}
# ================================
# 主函数
# ================================
main() {
if [ "$OUTPUT_FORMAT" = "text" ]; then
output_text
else
output_json
fi
}
# 执行主函数
main
#!/bin/bash
# ==============================================================================
# resource_check.sh
# ------------------------------------------------------------------------------
# 系统资源检测Shell脚本
#
# .SYNOPSIS
# 检测服务器CPU、内存、磁盘等资源使用情况
#
# .DESCRIPTION
# 检测系统CPU使用率、内存使用情况、磁盘空间、网络连接等资源指标。
#
# .PARAMETERS
# --format 输出格式(json/text,默认json)
# --check 检测类型(all/cpu/memory/disk/network,默认all)
#
# .EXAMPLE
# ./resource_check.sh
# ./resource_check.sh --format text --check cpu,memory
#
# .OUTPUTS
# JSON格式检测结果
#
# .NOTES
# 版本:1.0.0
# 创建日期:2026-05-13
#
# ==============================================================================
# 加载基础函数库
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/common.sh"
# ================================
# 参数解析
# ================================
OUTPUT_FORMAT="json"
CHECK_TYPE="all"
while [[ $# -gt 0 ]]; do
case $1 in
--format)
OUTPUT_FORMAT="$2"
shift 2
;;
--check)
CHECK_TYPE="$2"
shift 2
;;
*)
shift
;;
esac
done
# ================================
# CPU检测函数
# ================================
# 检测CPU使用率
check_cpu_usage() {
# 获取CPU使用率(取5秒平均值)
local cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
echo "${cpu_usage:-0}"
}
# 检测CPU负载
check_cpu_load() {
local load=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1,$2,$3}')
echo "$load"
}
# 检测CPU核心数
check_cpu_cores() {
local cores=$(get_cpu_cores)
echo "$cores"
}
# ================================
# 内存检测函数
# ================================
# 检测内存使用情况
check_memory_usage() {
local total_mb=$(get_total_memory)
local avail_mb=$(get_available_memory)
local used_mb=$((total_mb - avail_mb))
local usage_percent=$((used_mb * 100 / total_mb))
echo "${total_mb}|${used_mb}|${avail_mb}|${usage_percent}"
}
# 检测Swap使用情况
check_swap_usage() {
local swap_total=$(grep SwapTotal /proc/meminfo | awk '{print $2}')
local swap_free=$(grep SwapFree /proc/meminfo | awk '{print $2}')
if [ "$swap_total" -gt 0 ]; then
local swap_used=$((swap_total - swap_free))
local swap_percent=$((swap_used * 100 / swap_total))
echo "${swap_total}|${swap_used}|${swap_free}|${swap_percent}"
else
echo "0|0|0|0"
fi
}
# ================================
# 磁盘检测函数
# ================================
# 检测磁盘使用情况
check_disk_usage() {
df -h | grep -vE '^Filesystem|tmpfs|cdrom|udev' | awk '{print $1"|"$2"|"$3"|"$4"|"$5"|"$6}'
}
# 检测磁盘Inode使用情况
check_inode_usage() {
df -i | grep -vE '^Filesystem|tmpfs|cdrom|udev' | awk '{print $1"|"$2"|"$3"|"$4"|"$5"|"$6}'
}
# ================================
# 网络检测函数
# ================================
# 检测网络连接数
check_network_connections() {
# TCP连接数
local tcp_total=$(netstat -an 2>/dev/null | grep -c ESTABLISHED)
if [ -z "$tcp_total" ]; then
tcp_total=$(ss -tan 2>/dev/null | grep -c ESTABLISHED)
fi
# TIME_WAIT连接数
local time_wait=$(netstat -an 2>/dev/null | grep -c TIME_WAIT)
if [ -z "$time_wait" ]; then
time_wait=$(ss -tan 2>/dev/null | grep -c TIME_WAIT)
fi
echo "${tcp_total:-0}|${time_wait:-0}"
}
# ================================
# 输出函数
# ================================
# 输出JSON格式结果
output_json() {
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "{"
json_kv "check_type" "resource_check"
json_kv "timestamp" "$timestamp" false
# CPU信息
if [ "$CHECK_TYPE" = "all" ] || [ "$CHECK_TYPE" = "cpu" ]; then
local cpu_usage=$(check_cpu_usage)
local cpu_load=$(check_cpu_load)
local cpu_cores=$(check_cpu_cores)
echo " \"cpu\": {"
echo " \"cores\": $cpu_cores,"
echo " \"usage_percent\": $cpu_usage,"
echo " \"load_average\": \"$cpu_load\""
echo " },"
fi
# 内存信息
if [ "$CHECK_TYPE" = "all" ] || [ "$CHECK_TYPE" = "memory" ]; then
local mem_info=$(check_memory_usage)
IFS='|' read -r total used avail percent <<< "$mem_info"
local swap_info=$(check_swap_usage)
IFS='|' read -r swap_total swap_used swap_avail swap_percent <<< "$swap_info"
echo " \"memory\": {"
echo " \"total_mb\": $total,"
echo " \"used_mb\": $used,"
echo " \"available_mb\": $avail,"
echo " \"usage_percent\": $percent,"
echo " \"swap_total_mb\": $((swap_total / 1024)),"
echo " \"swap_used_mb\": $((swap_used / 1024)),"
echo " \"swap_usage_percent\": $swap_percent"
echo " },"
fi
# 磁盘信息
if [ "$CHECK_TYPE" = "all" ] || [ "$CHECK_TYPE" = "disk" ]; then
echo " \"disk\": {"
echo " \"mounts\": ["
local disks=$(check_disk_usage)
local first=true
while IFS= read -r disk; do
[ -z "$disk" ] && continue
IFS='|' read -r device size used avail percent mountpoint <<< "$disk"
if [ "$first" = true ]; then
first=false
else
echo ","
fi
# 移除百分号
local usage_val=$(echo $percent | tr -d '%')
echo -n " {"
echo -n "\"device\": \"$device\", "
echo -n "\"size\": \"$size\", "
echo -n "\"used\": \"$used\", "
echo -n "\"available\": \"$avail\", "
echo -n "\"usage_percent\": $usage_val, "
echo -n "\"mountpoint\": \"$mountpoint\""
echo -n "}"
done <<< "$disks"
echo ""
echo " ]"
echo " },"
fi
# 网络信息
if [ "$CHECK_TYPE" = "all" ] || [ "$CHECK_TYPE" = "network" ]; then
local net_info=$(check_network_connections)
IFS='|' read -r tcp_total time_wait <<< "$net_info"
echo " \"network\": {"
echo " \"tcp_connections\": $tcp_total,"
echo " \"time_wait_connections\": $time_wait"
echo " }"
fi
echo "}"
}
# 输出文本格式结果
output_text() {
echo "========== 系统资源检测 =========="
echo ""
# CPU信息
if [ "$CHECK_TYPE" = "all" ] || [ "$CHECK_TYPE" = "cpu" ]; then
echo "--- CPU ---"
echo "核心数: $(check_cpu_cores)"
echo "使用率: $(check_cpu_usage)%"
echo "负载平均: $(check_cpu_load)"
echo ""
fi
# 内存信息
if [ "$CHECK_TYPE" = "all" ] || [ "$CHECK_TYPE" = "memory" ]; then
local mem_info=$(check_memory_usage)
IFS='|' read -r total used avail percent <<< "$mem_info"
echo "--- 内存 ---"
echo "总计: ${total}MB"
echo "已用: ${used}MB"
echo "可用: ${avail}MB"
echo "使用率: ${percent}%"
echo ""
local swap_info=$(check_swap_usage)
IFS='|' read -r swap_total swap_used swap_avail swap_percent <<< "$swap_info"
if [ "$swap_total" -gt 0 ]; then
echo "--- Swap ---"
echo "总计: $((swap_total / 1024))MB"
echo "已用: $((swap_used / 1024))MB"
echo "使用率: ${swap_percent}%"
echo ""
fi
fi
# 磁盘信息
if [ "$CHECK_TYPE" = "all" ] || [ "$CHECK_TYPE" = "disk" ]; then
echo "--- 磁盘 ---"
check_disk_usage | while IFS='|' read -r device size used avail percent mountpoint; do
local usage_val=$(echo $percent | tr -d '%')
local status="正常"
if [ "$usage_val" -gt 80 ]; then
status="警告"
fi
if [ "$usage_val" -gt 90 ]; then
status="严重"
fi
printf " %-15s %10s %10s [%s] %s\n" "$mountpoint" "$size" "$used" "$percent" "$status"
done
echo ""
fi
# 网络信息
if [ "$CHECK_TYPE" = "all" ] || [ "$CHECK_TYPE" = "network" ]; then
echo "--- 网络 ---"
local net_info=$(check_network_connections)
IFS='|' read -r tcp_total time_wait <<< "$net_info"
echo "TCP连接数: $tcp_total"
echo "TIME_WAIT数: $time_wait"
echo ""
fi
echo "========== 检测完成 =========="
}
# ================================
# 主函数
# ================================
main() {
if [ "$OUTPUT_FORMAT" = "text" ]; then
output_text
else
output_json
fi
}
# 执行主函数
main
# _PRD_服务自检模块化拆分转换shell脚本 # _PRD_服务自检模块化拆分转换shell脚本
- 模块化的原脚本:
- AuxiliaryTool/ScriptTool/ServiceSelfInspection/modules
- 主脚本:
- AuxiliaryTool/ScriptTool/ServiceSelfInspection/check_server_health.ps1
## 1. 背景与目标 ## 1. 背景与目标
### 1.1 背景 ### 1.1 背景
当前拆分的模块化脚本为powshell格式的,我需要转换成shell脚本,这样也能在Linux下运行。减少维护量 当前拆分的模块化脚本为PowerShell格式,主脚本运行在Windows客户端上通过SSH远程检测Linux服务器。为了提升检测性能和减少维护成本,需要将检测模块转换为Shell脚本,直接在Linux服务器上执行。
### 1.2 目标 ### 1.2 目标
将模块化脚本转换成shell脚本,使得脚本在Linux下也能运行。 采用混合架构模式:**主脚本保持PowerShell(在Windows客户端运行),检测模块转换为Shell脚本(上传到Linux服务器执行)**
### 1.3 架构设计
```
┌─────────────────────────────────────────────────────────────────┐
│ Windows客户端 │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ check_server_health.ps1 (主协调脚本) │ │
│ │ - 服务器选择 │ │
│ │ - SSH连接管理 │ │
│ │ - Shell脚本上传 │ │
│ │ - 结果汇总 │ │
│ │ - 报告生成 │ │
│ └────────────────────────────────────────────────────────────┘ │
│ ↓ SSH上传/执行 │
├─────────────────────────────────────────────────────────────────┤
│ Linux服务器 │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ /tmp/health_check/ (临时执行目录) │ │
│ │ ├── common.sh (Shell基础函数库) │ │
│ │ ├── java_check.sh (Java服务检测) │ │
│ │ ├── docker_check.sh (Docker容器检测) │ │
│ │ ├── resource_check.sh (资源检测) │ │
│ │ ├── middleware_check.sh (中间件检测) │ │
│ │ └── *.sh (其他检测模块) │ │
│ └────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
```
--- ---
## 2. 功能需求 ## 2. 功能需求
AuxiliaryTool/ScriptTool/ServiceSelfInspection/modules目录下的脚本转为shell脚本,功能不变。
### 2.2.1 完整目录结构参考 ### 2.1 模块转换需求
下方的目录结果作为参考,不要改动到AuxiliaryTool/ScriptTool/服务器监测/路径的代码。 `AuxiliaryTool/ScriptTool/ServiceSelfInspection/modules` 目录下的PowerShell模块转换为Shell脚本。
### 2.2 模块转换映射表
| PowerShell模块 | Shell脚本 | 主要功能 | 执行方式 |
|----------------|-----------|----------|----------|
| Common.psm1 | common.sh | 日志、工具函数 | 被其他脚本source |
| ServiceCheck.psm1 | java_check.sh | Java服务检测 | 上传后SSH执行 |
| ContainerCheck.psm1 | docker_check.sh | Docker容器检测 | 上传后SSH执行 |
| ServerResourceAnalysis.psm1 | resource_check.sh | CPU/内存/磁盘检测 | 上传后SSH执行 |
| MiddlewareCheck.psm1 | middleware_check.sh | MQTT/Redis/MySQL检测 | 上传后SSH执行 |
| DNSCheck.psm1 | dns_check.sh | DNS解析检测 | 上传后SSH执行 |
| NTPCheck.psm1 | ntp_check.sh | 时间同步检测 | 上传后SSH执行 |
| LogExport.psm1 | log_export.sh | 日志导出功能 | 上传后SSH执行 |
| Report.psm1 | N/A (保持PowerShell) | 报告生成 | 主脚本处理 |
| ConfigIPCheck.psm1 | config_check.sh | 配置IP检测 | 上传后SSH执行 |
### 2.3 目录结构设计
``` ```
AuxiliaryTool/ScriptTool/服务器监测/ AuxiliaryTool/ScriptTool/ServiceSelfInspection/
├── check_server_health.ps1 # 主PowerShell脚本(协调器) ├── check_server_health.ps1 # 主PowerShell脚本(保持不变)
├── lib/ # 检测模块库目录 ├── lib/
│ ├── config.sh # 配置文件(密码、容器名、阈值等) │ ├── modules/ # PowerShell模块(保持不变)
│ ├── common.sh # 通用函数库(日志、工具函数等) │ │ ├── Common.psm1 # 公共基础函数
│ │ ├── ServiceCheck.psm1 # 服务检测模块
│ │ ├── ContainerCheck.psm1 # 容器检测模块
│ │ ├── DNSCheck.psm1 # DNS检测模块
│ │ ├── ServerResourceAnalysis.psm1 # 资源分析模块
│ │ ├── NTPCheck.psm1 # NTP检测模块
│ │ ├── AndroidCheck.psm1 # 安卓检测模块
│ │ ├── LogExport.psm1 # 日志导出模块
│ │ ├── MiddlewareCheck.psm1 # 中间件检测模块
│ │ ├── ConfigIPCheck.psm1 # 配置IP检测模块
│ │ └── Report.psm1 # 报告生成模块
│ │ │ │
│ ├── system/ # 系统基础检测模块 │ └── shell/ # 新增:Shell脚本目录
│ │ ├── 01_system_basic.sh # 系统基础信息 │ ├── common.sh # Shell基础函数库
│ │ ├── 02_cpu_check.sh # CPU资源检测 │ ├── config.sh # Shell配置文件
│ │ ├── 03_memory_check.sh # 内存资源检测 │ ├── java_check.sh # Java服务检测
│ │ ├── 04_disk_check.sh # 磁盘资源检测 │ ├── docker_check.sh # Docker容器检测
│ │ ├── 05_oom_check.sh # OOM和内核异常检测 │ ├── resource_check.sh # 资源检测
│ │ ├── 06_process_check.sh # 进程状态检测 │ ├── middleware_check.sh # 中间件检测
│ │ ├── 07_network_check.sh # 网络连接检测 │ ├── dns_check.sh # DNS检测
│ │ ├── 08_security_check.sh # 安全合规检测 │ ├── ntp_check.sh # NTP检测
│ │ ├── 09_system_logs.sh # 系统日志检测 │ ├── config_check.sh # 配置IP检测
│ │ ├── 10_time_sync.sh # 时间同步检测 │ └── log_export.sh # 日志导出
│ │ ├── 11_scheduled_tasks.sh # 定时任务检测
│ │ └── 12_port_check.sh # 端口服务检测
│ │
│ ├── service/ # 服务层检测模块
│ │ ├── 20_docker_basic.sh # Docker基础检测
│ │ ├── 21_docker_deep.sh # Docker深度检测
│ │ ├── 22_mysql_basic.sh # MySQL基础检测
│ │ ├── 23_mysql_depth.sh # MySQL深度检测(已存在,需适配)
│ │ ├── 24_redis_basic.sh # Redis基础检测
│ │ ├── 25_redis_depth.sh # Redis深度检测(已存在,需适配)
│ │ ├── 26_emqx_basic.sh # EMQX基础检测
│ │ ├── 27_emqx_deep.sh # EMQX深度检测
│ │ ├── 28_java_check.sh # Java应用检测
│ │ ├── 29_python_check.sh # Python应用检测
│ │ ├── 30_nginx_check.sh # Nginx应用检测
│ │ ├── 31_nacos_check.sh # Nacos应用检测
│ │ ├── 32_fastdfs_check.sh # FastDFS检测
│ │ └── 33_app_logs.sh # 应用日志分析
│ │
│ └── utils/ # 工具脚本
│ ├── upload.sh # 文件上传工具
│ ├── execute.sh # 批量执行工具
│ └── collect.sh # 结果收集工具
├── bin/ # 可执行工具 ├── bin/ # 可执行工具
│ ├── plink.exe # SSH连接工具 │ ├── plink.exe # SSH连接工具
...@@ -69,6 +94,79 @@ AuxiliaryTool/ScriptTool/服务器监测/ ...@@ -69,6 +94,79 @@ AuxiliaryTool/ScriptTool/服务器监测/
└── reports/ # 报告输出目录 └── reports/ # 报告输出目录
``` ```
### 2.4 通信协议设计
#### 2.4.1 调用流程
1. PowerShell主脚本建立SSH连接
2. 上传Shell脚本到Linux服务器临时目录
3. 执行Shell脚本并获取JSON格式输出
4. 解析JSON结果并汇总
5. 清理临时文件
#### 2.4.2 JSON返回格式示例
```json
{
"check_type": "java_service",
"container": "ujava2",
"platform": "new",
"timestamp": "2026-05-13 12:00:00",
"services": [
{"name": "auth", "jar": "ubains-auth.jar", "status": "运行中", "count": 1},
{"name": "gateway", "jar": "ubains-gateway.jar", "status": "运行中", "count": 1},
{"name": "system", "jar": "ubains-modules-system.jar", "status": "未运行", "count": 0}
]
}
```
---
## 3. 技术要求
### 3.1 Shell脚本编写规范
- 使用Bash Shell(#!/bin/bash)
- 遵循Shell脚本最佳实践
- 函数命名采用小写+下划线格式(如:check_java_service)
- 输出格式为标准JSON,便于PowerShell解析
### 3.2 错误处理
- Shell脚本需要正确处理错误情况
- 返回适当的错误码和错误信息
- 确保临时文件正确清理
### 3.3 兼容性要求
- 支持CentOS 7/8
- 支持Ubuntu 18.04/20.04
- 支持ARM架构服务器
---
## 4. 交付物
### 4.1 代码交付
- [ ] lib/shell/ 目录下所有Shell脚本
- [ ] 更新的check_server_health.ps1(增加Shell模式调用)
- [ ] Shell脚本使用说明文档
### 4.2 文档交付
- [ ] Shell脚本开发规范文档
- [ ] 模块转换对照表
- [ ] 测试验证报告
---
### 规范文档
- 代码规范: `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`
- 计划执行: `Docs/PRD/服务自检/需求文档/_PRD_服务自检模块化拆分转换shell脚本_需求文档_计划执行_v2.md`
---
*文档版本: v2 (混合架构版)*
*最后更新: 2026-05-13*
### 规范文档 ### 规范文档
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md` - 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
- 问题总结: `Docs/PRD/01规范文档/_PRD_问题总结_记录文档.md` - 问题总结: `Docs/PRD/01规范文档/_PRD_问题总结_记录文档.md`
......
# _PRD_服务自检模块化拆分转换shell脚本_需求文档_计划执行_v2
> PRD来源: `Docs/PRD/服务自检/需求文档/_PRD_服务自检模块化拆分转换shell脚本_需求文档.md`
**调整说明**: 主脚本保持PowerShell(在Windows上运行),模块转换为Shell脚本(上传到Linux服务器执行)
---
## 1. 需求分析
### 1.1 转换目标
将PowerShell模块转换为Shell脚本,通过主PowerShell脚本上传到Linux服务器并执行,实现跨平台检测能力。
### 1.2 架构设计
```
┌─────────────────────────────────────────────────────────────────┐
│ Windows客户端 │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ check_server_health.ps1 (主协调脚本) │ │
│ │ - 服务器选择 │ │
│ │ - SSH连接管理 │ │
│ │ - 结果汇总 │ │
│ │ - 报告生成 │ │
│ └────────────────────────────────────────────────────────────┘ │
│ ↓ SSH上传/执行 │
├─────────────────────────────────────────────────────────────────┤
│ Linux服务器 │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ /tmp/health_check/ (临时目录) │ │
│ │ ├── common.sh (基础函数) │ │
│ │ ├── java_check.sh (Java服务检测) │ │
│ │ ├── docker_check.sh (Docker容器检测) │ │
│ │ ├── resource_check.sh (资源检测) │ │
│ │ ├── middleware_check.sh (中间件检测) │ │
│ │ └── report.sh (结果收集) │ │
│ └────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
```
---
## 2. 转换策略
### 2.1 混合架构设计
**PowerShell主脚本职责**:
- 服务器连接和认证管理
- 检测流程调度
- Shell脚本上传和管理
- 结果解析和汇总
- 报告生成
**Shell模块职责**:
- 在Linux服务器上执行具体检测
- 收集系统和服务信息
- 返回JSON格式结果
### 2.2 模块转换映射
| PowerShell模块 | Shell脚本 | 执行方式 | 返回格式 |
|----------------|-----------|----------|----------|
| ServiceCheck.psm1 | java_check.sh | 上传后SSH执行 | JSON |
| ContainerCheck.psm1 | docker_check.sh | 上传后SSH执行 | JSON |
| ServerResourceAnalysis.psm1 | resource_check.sh | 上传后SSH执行 | JSON |
| MiddlewareCheck.psm1 | middleware_check.sh | 上传后SSH执行 | JSON |
| DNSCheck.psm1 | dns_check.sh | 上传后SSH执行 | JSON |
| NTPCheck.psm1 | ntp_check.sh | 上传后SSH执行 | JSON |
| Common.psm1 | common.sh | 被其他脚本source | N/A |
### 2.3 通信协议
```powershell
# PowerShell主脚本中的调用模式
function Invoke-RemoteShellCheck {
param($Server, $ScriptName, $Arguments)
# 1. 上传Shell脚本到服务器
$remotePath = "/tmp/health_check/$ScriptName"
Copy-File-To-Remote -Server $Server -LocalPath "lib\shell\$ScriptName" -RemotePath $remotePath
# 2. 执行Shell脚本并获取JSON结果
$cmd = "chmod +x $remotePath && $remotePath $Arguments"
$result = Invoke-SSHCommand -Server $Server -Command $cmd
# 3. 解析JSON结果
return $result.Output | ConvertFrom-Json
}
```
---
## 3. 执行计划
### 3.1 第一阶段:Shell脚本开发(保持PowerShell主脚本不变)
**任务清单**:
- [ ] 创建lib/shell目录结构
- [ ] 实现common.sh(基础函数库)
- [ ] 实现java_check.sh(Java服务检测)
- [ ] 实现docker_check.sh(Docker容器检测)
- [ ] 实现resource_check.sh(资源检测)
- [ ] 实现middleware_check.sh(中间件检测)
**目录结构**:
```
AuxiliaryTool/ScriptTool/ServiceSelfInspection/
├── check_server_health.ps1 # 主PowerShell脚本(保持不变)
├── lib/
│ ├── modules/ # PowerShell模块(保持不变)
│ │ ├── Common.psm1
│ │ ├── ServiceCheck.psm1
│ │ └── ...
│ └── shell/ # 新增:Shell脚本目录
│ ├── common.sh # Shell基础函数库
│ ├── java_check.sh # Java服务检测
│ ├── docker_check.sh # Docker容器检测
│ ├── resource_check.sh # 资源检测
│ ├── middleware_check.sh # 中间件检测
│ ├── dns_check.sh # DNS检测
│ ├── ntp_check.sh # NTP检测
│ └── config.sh # Shell配置文件
```
### 3.2 第二阶段:集成到主脚本
**集成方式**:
```powershell
# 在主脚本中添加Shell脚本调用逻辑
function Test-UjavaServices-Shell {
param($Server, $ContainerName, $PlatformType)
# 检测是否使用Shell脚本模式
if ($global:UseShellMode) {
# 使用Shell脚本检测
$args = "--container $ContainerName --platform $PlatformType"
$result = Invoke-RemoteShellCheck -Server $Server -ScriptName "java_check.sh" -Arguments $args
return $result.services
}
else {
# 使用原有PowerShell模块检测
return Test-UjavaServices -Server $Server -ContainerName $ContainerName -PlatformType $PlatformType
}
}
```
### 3.3 Shell脚本详细设计
#### common.sh(基础函数库)
```bash
#!/bin/bash
# 日志函数(输出到标准输出,由PowerShell主脚本收集)
log_info() { echo "[INFO] $1"; }
log_error() { echo "[ERROR] $1"; }
log_warn() { echo "[WARN] $1"; }
log_success() { echo "[SUCCESS] $1"; }
# JSON输出辅助函数
json_start() { echo "{"; }
json_end() { echo "}"; }
json_kv() { echo " \"$1\": \"$2\","; }
json_array_start() { echo " \"$1\": ["; }
json_array_end() { echo " ]"; }
# Docker命令执行
docker_exec() {
local container=$1
local cmd=$2
docker exec $container sh -c "$cmd" 2>/dev/null
}
# 进程检测
check_process() {
local pattern=$1
local count=$(ps aux | grep -v grep | grep "$pattern" | wc -l)
echo $count
}
```
#### java_check.sh(Java服务检测)
```bash
#!/bin/bash
# 加载基础函数
source /tmp/health_check/common.sh
# 解析参数
CONTAINER=""
PLATFORM=""
while [[ $# -gt 0 ]]; do
case $1 in
--container) CONTAINER="$2"; shift 2 ;;
--platform) PLATFORM="$2"; shift 2 ;;
esac
done
# 输出JSON格式结果
echo "{"
echo " \"container\": \"$CONTAINER\","
echo " \"platform\": \"$PLATFORM\","
echo " \"services\": ["
# 检测各个Java服务
services=("auth:ubains-auth.jar" "gateway:ubains-gateway.jar" ...)
first=true
for svc in "${services[@]}"; do
IFS=':' read -r name jar <<< "$svc"
if [ -n "$CONTAINER" ]; then
count=$(docker_exec $CONTAINER "ps aux | grep $jar | grep -v grep | wc -l")
else
count=$(check_process "$jar")
fi
status=$([ $count -gt 0 ] && echo "运行中" || echo "未运行")
if [ "$first" = true ]; then
first=false
else
echo ","
fi
echo " {\"name\": \"$name\", \"jar\": \"$jar\", \"status\": \"$status\", \"count\": $count}"
done
echo ""
echo " ]"
echo "}"
```
---
## 4. 实现细节
### 4.1 PowerShell调用Shell的完整流程
```powershell
function Invoke-RemoteShellCheck {
param(
[hashtable]$Server,
[string]$ScriptName,
[string]$Arguments = ""
)
# 1. 创建远程临时目录
$tmpDir = "/tmp/health_check"
Invoke-SSHCommand -Server $Server -Command "mkdir -p $tmpDir" | Out-Null
# 2. 上传基础函数库
$commonPath = Join-Path $SCRIPT_DIR "lib\shell\common.sh"
Copy-File-To-Remote -Server $Server -LocalPath $commonPath -RemotePath "$tmpDir/common.sh"
# 3. 上传检测脚本
$scriptPath = Join-Path $SCRIPT_DIR "lib\shell\$ScriptName"
Copy-File-To-Remote -Server $Server -LocalPath $scriptPath -RemotePath "$tmpDir/$ScriptName"
# 4. 执行脚本
$cmd = "cd $tmpDir && chmod +x common.sh $ScriptName && ./$ScriptName $Arguments"
$result = Invoke-SSHCommand -Server $Server -Command $cmd
# 5. 清理临时文件
Invoke-SSHCommand -Server $Server -Command "rm -rf $tmpDir" | Out-Null
# 6. 返回结果
return $result.Output -join "`n"
}
```
### 4.2 配置模式切换
```powershell
# 在主脚本开头添加模式选择
$global:UseShellMode = $false # 默认使用PowerShell模块
# 可通过参数或配置文件切换
if ($args -contains "--use-shell") {
$global:UseShellMode = $true
Write-Host "[模式] 使用Shell脚本检测模式" -ForegroundColor Cyan
}
```
---
## 5. 优势对比
| 特性 | 纯PowerShell模式 | 混合模式 |
|------|-----------------|----------|
| Windows客户端支持 | ✅ 原生 | ✅ 原生 |
| Linux服务器检测 | ✅ 通过SSH | ✅ 直接执行Shell |
| 检测性能 | 中等 | 更快(本地执行) |
| 复杂逻辑处理 | ✅ PowerShell强大 | ⚠️ Shell需额外处理 |
| 维护成本 | 单一语言 | 双语言 |
| 跨平台兼容性 | 中等 | 更好 |
---
## 6. 测试验证计划
### 6.1 功能测试
- [ ] Shell脚本独立执行测试
- [ ] PowerShell主脚本调用测试
- [ ] 结果JSON解析测试
- [ ] 错误处理测试
### 6.2 兼容性测试
- [ ] CentOS 7/8 测试
- [ ] Ubuntu 18.04/20.04 测试
- [ ] ARM架构服务器测试
---
## 7. 优化功能回填
| 优化项 | 状态 | 说明 |
|--------|------|------|
| Shell脚本基础框架 | 待实施 | common.sh基础函数库 |
| Java服务检测Shell脚本 | 待实施 | java_check.sh |
| Docker容器检测Shell脚本 | 待实施 | docker_check.sh |
| PowerShell调用封装 | 待实施 | Invoke-RemoteShellCheck函数 |
| 模式切换机制 | 待实施 | 支持PowerShell/Shell双模式 |
| 结果JSON解析 | 待实施 | PowerShell解析Shell返回的JSON |
---
*文档生成时间: 2026-05-13*
*版本: v2 (混合架构版)*
...@@ -147,8 +147,6 @@ function mysql_arm() { ...@@ -147,8 +147,6 @@ function mysql_arm() {
local mysql_root_password="dNrprU&2S" local mysql_root_password="dNrprU&2S"
local mysql_port="8306" local mysql_port="8306"
local host_data_dir="/data/middleware/mysql" local host_data_dir="/data/middleware/mysql"
local backup_script_src="$PWD/UbainsmysqlBakUp.sh"
local backup_script_dst="/usr/local/docker/UbainsmysqlBakUp.sh"
local cron_user="root" local cron_user="root"
log "INFO" "==================================================================" log "INFO" "=================================================================="
...@@ -277,42 +275,6 @@ function mysql_arm() { ...@@ -277,42 +275,6 @@ function mysql_arm() {
done done
log "INFO" "✅ 用户权限提升完成" log "INFO" "✅ 用户权限提升完成"
# ------------------- 部署备份脚本 -------------------
log "INFO" "📦 部署备份脚本到容器..."
$SUDO mkdir -p "$(dirname "$backup_script_dst")"
if $SUDO cp -f "$backup_script_src" "$backup_script_dst"; then
$SUDO chmod +x "$backup_script_dst"
log "INFO" "✅ 备份脚本已复制到: $backup_script_dst"
else
log "ERROR" "⛔ 备份脚本复制失败,请检查源文件是否存在"
return 1
fi
# ------------------- 配置定时任务 -------------------
log "INFO" "⏰ 配置定时备份任务 (每天 13:00)"
local cron_job="0 13 * * * bash $backup_script_dst"
if $SUDO crontab -u "$cron_user" -l 2>/dev/null | grep -Fq "$backup_script_dst"; then
log "INFO" "✅ 定时任务已存在"
else
( $SUDO crontab -u "$cron_user" -l 2>/dev/null; echo "$cron_job" ) | $SUDO crontab -u "$cron_user" -
if [[ $? -eq 0 ]]; then
log "INFO" "✅ 定时任务添加成功"
else
log "ERROR" "⛔ 定时任务添加失败"
return 1
fi
fi
# ------------------- 重启 crond -------------------
log "INFO" "🔄 重启 crond 服务..."
if command -v systemctl >/dev/null; then
$SUDO systemctl restart crond || $SUDO systemctl restart cron
else
$SUDO service crond restart || $SUDO service cron restart
fi
log "INFO" "✅ crond 服务已重启"
# ------------------- 最终状态输出 ------------------- # ------------------- 最终状态输出 -------------------
log "INFO" "🎉 MySQL 部署完成!" log "INFO" "🎉 MySQL 部署完成!"
$SUDO docker ps --filter "name=$container_name" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" $SUDO docker ps --filter "name=$container_name" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
...@@ -409,7 +371,7 @@ function redis_arm() ...@@ -409,7 +371,7 @@ function redis_arm()
{ {
# ------------------- 定义变量 ------------------- # ------------------- 定义变量 -------------------
local container_name="uredis" local container_name="uredis"
local image_tar="arm_redis8.2.2.tar.gz" local image_tar="/data/temp/arm_redis8.2.2.tar.gz"
local image_name="redis:v8.2.2" local image_name="redis:v8.2.2"
local image_id="3bd8c109f88b" local image_id="3bd8c109f88b"
local redis_conf_host="/data/middleware/redis/config/redis.conf" local redis_conf_host="/data/middleware/redis/config/redis.conf"
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论