点击查看代码
#!/bin/bash
# 系统关键信息收集脚本(修复版)
# 功能:收集CPU/内存/磁盘/系统版本等核心信息,解决磁盘使用率判断语法错误# 颜色定义(异常指标标注)
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m' # 重置颜色# 检查核心命令是否存在
check_dependency() {local cmd=$1if ! command -v "$cmd" &> /dev/null; thenecho -e "${RED}[错误] 缺少必要命令: $cmd,请先安装(如 yum install procps-ng)${NC}"exit 1fi
}
check_dependency "nproc"
check_dependency "df"
check_dependency "free"# 1. 基础信息(时间、系统版本、执行用户)
echo -e "==== 系统关键信息收集报告 | 执行时间: $(date +"%Y-%m-%d %H:%M:%S") ====\n"# 系统版本(兼容RPM/DEB系)
if [ -f /etc/redhat-release ]; thenSYS_VERSION=$(cat /etc/redhat-release)
elif [ -f /etc/lsb-release ]; thenSYS_VERSION=$(grep "DESCRIPTION" /etc/lsb-release | cut -d'=' -f2 | sed 's/"//g')
elseSYS_VERSION=$(cat /etc/issue | head -1 | sed 's/\r//')
fi# 内网IP(兼容旧版系统hostname -I空值问题)
IP_ADDR=$(hostname -I | awk '{print $1}')
if [ -z "$IP_ADDR" ]; thenIP_ADDR=$(ip -4 addr show | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep -v '127.0.0.1' | head -1)
fi# 2. CPU信息(核心数+使用率+负载+IO等待)
CPU_CORES=$(nproc)# CPU使用率+IO等待率(1秒采样,更准确)
read cpu user nice system idle iowait irq softirq steal guest < /proc/stat
CPU_IDLE_BEFORE=$idle
CPU_IOWAIT_BEFORE=$iowait
CPU_TOTAL_BEFORE=$((user + nice + system + idle + iowait + irq + softirq + steal))
sleep 1
read cpu user nice system idle iowait irq softirq steal guest < /proc/stat
CPU_IDLE_AFTER=$idle
CPU_IOWAIT_AFTER=$iowait
CPU_TOTAL_AFTER=$((user + nice + system + idle + iowait + irq + softirq + steal))# 计算CPU使用率(排除idle)和IO等待率
CPU_USAGE_RAW=$(echo "scale=2; 100 * ($CPU_TOTAL_AFTER - $CPU_TOTAL_BEFORE - $CPU_IDLE_AFTER + $CPU_IDLE_BEFORE) / ($CPU_TOTAL_AFTER - $CPU_TOTAL_BEFORE)" | bc)
CPU_USAGE=$(printf "%.2f" "$CPU_USAGE_RAW")
CPU_IOWAIT_RAW=$(echo "scale=2; 100 * ($CPU_IOWAIT_AFTER - $CPU_IOWAIT_BEFORE) / ($CPU_TOTAL_AFTER - $CPU_TOTAL_BEFORE)" | bc)
CPU_IOWAIT=$(printf "%.2f" "$CPU_IOWAIT_RAW")# 系统负载(1/5/15分钟,反映长期压力)
LOAD_1=$(uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}' | xargs)
LOAD_5=$(uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $2}' | xargs)
LOAD_15=$(uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $3}' | xargs)# 3. 内存+Swap信息(兼容free输出差异)
FREE_LINE=$(free -h | awk 'NR==2')
# 部分系统available列是第4列(如free 3.3.10),部分是第7列(如free 3.4.0)
if echo "$FREE_LINE" | awk '{print $4}' | grep -q 'G\|M'; thenMEM_AVAILABLE=$(echo "$FREE_LINE" | awk '{print $4}')
elseMEM_AVAILABLE=$(echo "$FREE_LINE" | awk '{print $7}')
fi
MEM_TOTAL=$(echo "$FREE_LINE" | awk '{print $2}')
MEM_USED=$(echo "$FREE_LINE" | awk '{print $3}')# Swap信息(内存不足时的关键指标)
SWAP_LINE=$(free -h | awk 'NR==3')
SWAP_TOTAL=$(echo "$SWAP_LINE" | awk '{print $2}')
SWAP_USED=$(echo "$SWAP_LINE" | awk '{print $3}')
SWAP_AVAIL=$(echo "$SWAP_LINE" | awk '{print $4}')# 4. 磁盘信息(修复使用率判断+优化最大挂载盘筛选)
# 根分区(/)- 修复:先去除%符号再比较
ROOT_DISK=$(df -h / | awk 'NR==2')
ROOT_TOTAL=$(echo "$ROOT_DISK" | awk '{print $2}')
ROOT_USED=$(echo "$ROOT_DISK" | awk '{print $3}')
ROOT_AVAIL=$(echo "$ROOT_DISK" | awk '{print $4}')
ROOT_USAGE_PCT=$(echo "$ROOT_DISK" | awk '{print $5}')
ROOT_USAGE_NUM=${ROOT_USAGE_PCT%\%} # 关键修复:去除%符号,转为纯数字(如31%→31)# 最大挂载磁盘(优化:排除Docker overlay临时分区+系统临时分区)
# 排除规则:不包含 /var/lib/docker/overlay2/、tmpfs、devtmpfs、loop
DATA_MOUNT=$(df -h --output=source,target,size,used,avail,pcent \-x tmpfs -x devtmpfs -x loop | awk 'NR>1 && $2 !~ /\/var\/lib\/docker\/overlay2\//' \| sort -k3 -h | tail -n 1)if [ -z "$DATA_MOUNT" ]; thenDATA_INFO="无非系统挂载磁盘(或所有挂载盘均为排除项)"
elseDATA_PATH=$(echo "$DATA_MOUNT" | awk '{print $2}')DATA_TOTAL=$(echo "$DATA_MOUNT" | awk '{print $3}')DATA_USED=$(echo "$DATA_MOUNT" | awk '{print $4}')DATA_AVAIL=$(echo "$DATA_MOUNT" | awk '{print $5}')DATA_USAGE_PCT=$(echo "$DATA_MOUNT" | awk '{print $6}')DATA_INFO="路径: $DATA_PATH | 总大小: $DATA_TOTAL | 已用: $DATA_USED | 剩余: $DATA_AVAIL | 使用率: $DATA_USAGE_PCT"
fi# 5. 表格化输出(修复后无语法错误)
echo -e "【1. 基础信息】"
echo -e "系统版本: $SYS_VERSION"
echo -e "内网IP : $IP_ADDR"
echo -e "执行用户: $(whoami)\n"echo -e "【2. CPU信息】"
echo -e "核心数 : $CPU_CORES"
echo -e "使用率 : $(if (( $(echo "$CPU_USAGE > 80" | bc -l) )); then echo -e "${RED}$CPU_USAGE%${NC}"; else echo "$CPU_USAGE%"; fi) (阈值:>80%告警)"
echo -e "IO等待率 : $(if (( $(echo "$CPU_IOWAIT > 10" | bc -l) )); then echo -e "${YELLOW}$CPU_IOWAIT%${NC}"; else echo "$CPU_IOWAIT%"; fi) (阈值:>10%可能IO瓶颈)"
echo -e "系统负载 : 1分钟=$LOAD_1 | 5分钟=$LOAD_5 | 15分钟=$LOAD_15 (参考值:<CPU核心数*2)\n"echo -e "【3. 内存+Swap信息】"
echo -e "内存总量 : $MEM_TOTAL"
echo -e "已用内存 : $MEM_USED"
echo -e "可利用内存: $MEM_AVAILABLE"
echo -e "Swap总量 : $SWAP_TOTAL"
echo -e "已用Swap : $(if [ "$SWAP_USED" != "0B" ] && echo "$SWAP_USED" | grep -qE 'G|M'; then echo -e "${YELLOW}$SWAP_USED${NC}"; else echo "$SWAP_USED"; fi) (非0B可能内存压力)\n"echo -e "【4. 磁盘信息】"
# 使用修复后的纯数字变量 ROOT_USAGE_NUM 进行判断
echo -e "根分区(/): 总大小=$ROOT_TOTAL | 已用=$ROOT_USED | 剩余=$ROOT_AVAIL | 使用率=$(if (( ROOT_USAGE_NUM > 85 )); then echo -e "${RED}$ROOT_USAGE_PCT${NC}"; else echo "$ROOT_USAGE_PCT"; fi)"
echo -e "最大挂载盘: $DATA_INFO"
echo -e "\n==== 信息收集完成 ===="
执行结果
点击查看代码
==== 系统关键信息收集报告 | 执行时间: 2025-11-03 17:06:55 ====【1. 基础信息】
系统版本: Ubuntu 22.04.4 LTS
内网IP : 10.0.0.233
执行用户: root【2. CPU信息】
核心数 : 2
使用率 : 36.50% (阈值:>80%告警)
IO等待率 : 0.00% (阈值:>10%可能IO瓶颈)
系统负载 : 1分钟=0.81 | 5分钟=0.89 | 15分钟=0.88 (参考值:<CPU核心数*2)【3. 内存+Swap信息】
内存总量 : 3.8Gi
已用内存 : 935Mi
可利用内存: 125Mi
Swap总量 : 0B
已用Swap : 0B (非0B可能内存压力)【4. 磁盘信息】
根分区(/): 总大小=48G | 已用=14G | 剩余=32G | 使用率=31%
最大挂载盘: 路径: / | 总大小: 48G | 已用: 14G | 剩余: 32G | 使用率: 31%==== 信息收集完成 ====