提交 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 {
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
......@@ -147,8 +147,6 @@ function mysql_arm() {
local mysql_root_password="dNrprU&2S"
local mysql_port="8306"
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"
log "INFO" "=================================================================="
......@@ -277,42 +275,6 @@ function mysql_arm() {
done
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 部署完成!"
$SUDO docker ps --filter "name=$container_name" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
......@@ -409,7 +371,7 @@ function redis_arm()
{
# ------------------- 定义变量 -------------------
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_id="3bd8c109f88b"
local redis_conf_host="/data/middleware/redis/config/redis.conf"
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论