#!/bin/bash
set -euo pipefail
mapfile -t SPEC_DATA <<< "$(cat << 'EOF'
A,service01,4,8
A,service02,2,4
A,service03,3,6
A,service04,4,8
A,service05,1,2
A,service06,2,4
A,service07,3,6
A,service08,4,8
A,service09,2,4
A,service10,1,2
A,service11,2,4
A,service12,4,8
B,service01,2,4
B,service02,1,2
B,service03,2,4
B,service04,3,6
B,service05,1,2
B,service06,2,4
B,service07,3,6
B,service08,2,4
B,service09,1,2
B,service10,2,4
B,service11,1,2
B,service12,2,4
# TODO: 补全 C、D、E、F、G 场景的 12 条规格
EOF
)"
PATH1="/path/to/dir1"; REQ1=17
PATH2="/path/to/dir2"; REQ2=30
USERNAME="srevice"
GREEN='\e[32m'; RED='\e[31m'; YELLOW='\e[33m'; NC='\e[0m'
usage(){
echo "用法: $0 <场景编号> <IP1> <IP2>"
echo " 场景:A ~ G(大小写均可)"
echo " IP1、IP2:待检测的两个目标 IP"
exit 1
}
[ $# -eq 3 ] || usage
SCENE="${1^^}"
[[ "$SCENE" =~ ^[A-G]$ ]] || usage
IP1="$2"; IP2="$3"
LATENCY_REQ=100
NODE_CPU=$(nproc)
NODE_MEM_BYTES=$(free -b | awk '/^Mem:/ {print $2}')
NODE_MEM=$(( NODE_MEM_BYTES / 1024 / 1024 / 1024 ))
declare -A req_cpu req_mem
for entry in "${SPEC_DATA[@]}"; do
IFS=, read -r scene svc cpu mem <<< "$entry"
[[ "$scene" != "$SCENE" ]] && continue
req_cpu["$svc"]=$cpu
req_mem["$svc"]=$mem
done
[ ${#req_cpu[@]} -gt 0 ] || { echo "未找到场景 ${SCENE} 的规格数据!"; exit 1; }
mapfile -t RUNNING_SVCS < <(
ps -eo args --no-headers \
| grep -o 'DAPP_NAME=[^ ]*' \
| sed 's/^DAPP_NAME=//' \
| sort -u
)
echo -e "\n1. 服务规格检查(严格相等)—— 节点: ${NODE_CPU}U ${NODE_MEM}G"
for svc in $(printf "%s\n" "${!req_cpu[@]}" | sort); do
want_cpu=${req_cpu[$svc]}
want_mem=${req_mem[$svc]}
if [[ " ${RUNNING_SVCS[*]} " =~ " ${svc} " ]]; then
if [ "$NODE_CPU" -eq "$want_cpu" ] && [ "$NODE_MEM" -eq "$want_mem" ]; then
status="${GREEN}OK${NC}"
else
status="${RED}NOK${NC}"
fi
else
status="${YELLOW}NOT RUN${NC}"
fi
printf "%-12s : %2sU %2sG : %s\n" "$svc" "$want_cpu" "$want_mem" "$status"
done
echo -e "\n2. 磁盘空间检查(可用 ≥ 要求)"
avail1=$(df -BG "$PATH1" | awk 'NR==2{gsub("G","",$4); print $4}')
if [ "$avail1" -ge "$REQ1" ]; then
echo "路径1 ($PATH1) : ${GREEN}合格${NC}(可用 ${avail1}G ≥ ${REQ1}G)"
else
echo "路径1 ($PATH1) : ${RED}不合格${NC}(可用 ${avail1}G < ${REQ1}G)"
fi
avail2=$(df -BG "$PATH2" | awk 'NR==2{gsub("G","",$4); print $4}')
if [ "$avail2" -ge "$REQ2" ]; then
echo "路径2 ($PATH2) : ${GREEN}合格${NC}(可用 ${avail2}G ≥ ${REQ2}G)"
else
echo "路径2 ($PATH2) : ${RED}不合格${NC}(可用 ${avail2}G < ${REQ2}G)"
fi
echo -e "\n3. 密码过期检查 (chage -l $USERNAME)"
out=$(chage -l "$USERNAME" 2>&1) || out="Unable to run chage"
if echo "$out" | grep -qE 'Password expires\s*:\s*never'; then
echo "chage -l $USERNAME : ${GREEN}OK${NC}"
else
echo "chage -l $USERNAME : ${RED}NOK${NC}"
fi
echo "命令输出:"
echo "$out"
echo -e "\n4. agent 进程检查 (ps -ef | grep agent)"
mapfile -t AGENTS < <(ps -eo args --no-headers | grep '[a]gent')
if [ ${#AGENTS[@]} -gt 0 ]; then
echo "ps -ef | grep agent : ${GREEN}OK${NC}"
echo -n "包含 agent 的路径为:"
paths=($(printf "%s\n" "${AGENTS[@]}" | awk '{print $1}' | sort -u))
IFS=','; echo "${paths[*]}"
else
echo "ps -ef | grep agent : ${RED}NOK${NC}(未检测到 agent 进程)"
fi
echo -e "\n5. 网络时延检查(平均时延 ≤ ${LATENCY_REQ}ms)"
for ip in "$IP1" "$IP2"; do
if ! ping_out=$(ping -c 10 "$ip" 2>/dev/null); then
avg="--"; status="${RED}NOK${NC}"
else
raw_avg=$(awk -F'/' '/^rtt/{print $5}' <<< "$ping_out")
avg_int=${raw_avg%%.*}; avg_int=${avg_int:-0}
if [ "$avg_int" -gt "$LATENCY_REQ" ]; then
status="${RED}NOK${NC}"
else
status="${GREEN}OK${NC}"
fi
avg="$raw_avg"
fi
printf "Ping %-15s : 平均时延 %6sms : %s\n" "$ip" "$avg" "$status"
done
echo -e "\n6. /etc 下服务配置路径检查"
for svc in $(printf "%s\n" "${!req_cpu[@]}" | sort); do
cfg="/etc/${svc}"
if [ -e "$cfg" ]; then
status="${GREEN}FOUND${NC}"
else
status="${RED}MISSING${NC}"
fi
printf "%-12s : %s\n" "$cfg" "$status"
done