增加第六步骤

#!/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    # ms

#—————————————————————————————
# 1. 服务规格检查
#—————————————————————————————
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

#—————————————————————————————
# 2. 磁盘空间检查
#—————————————————————————————
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

#—————————————————————————————
# 3. 密码过期检查
#—————————————————————————————
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"

#—————————————————————————————
# 4. agent 进程检查
#—————————————————————————————
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

#—————————————————————————————
# 5. 网络时延检查(整数比较)
#—————————————————————————————
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

#—————————————————————————————
# 6. /etc 下服务配置路径检查
#—————————————————————————————
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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值