[Linux]Linux系统健康检查报告生成工具(Shell脚本实现详解)

一、工具概述

1.1 工具背景

在Linux服务器运维中,快速获取系统健康状态是日常运维的重要工作。传统命令行操作存在信息分散、可视化差等问题,本工具通过Shell脚本实现系统关键指标的自动化采集与可视化报告生成。

1.2 主要功能

  • 实时采集CPU/内存/磁盘/进程信息
  • 自动生成HTML可视化报告
  • 异常状态智能标记
  • 多维度性能指标展示

1.3 核心优势

  • 执行时间<3秒
  • 零额外依赖(仅需基础命令)
  • 支持自定义告警阈值
  • 自适应网页布局

二、实现原理剖析

2.1 整体架构设计

graph TD A[主控制流程] --> B[环境初始化] A --> C[依赖检查] A --> D[数据采集] D --> E[CPU信息] D --> F[内存信息] D --> G[磁盘信息] D --> H[进程信息] A --> I[HTML生成] I --> J[可视化报告]

2.2 关键技术实现

2.2.1 安全临时目录管理

bash 复制代码
TMP_DIR=$(mktemp -d -t sysinfo-XXXXXX)  # 创建随机临时目录
trap 'cleanup' EXIT                     # 注册退出清理函数

cleanup() {
    rm -rf "${TMP_DIR}"                # 清理残留文件
    echo "[INFO] 临时文件已清理"
}

实现要点

  • 使用mktemp创建唯一临时目录
  • 通过trap确保异常退出时自动清理
  • 避免多实例运行时文件冲突

2.2.2 负载智能计算算法

bash 复制代码
local cores=$(lscpu | grep '^CPU(s):' | awk '{print $2}')
local load=$(awk '{print $1,$2,$3}' /proc/loadavg)
local load_percent=$(echo "scale=0; 100 * ${load// /+} / ${cores}" | bc)

算法解析

  1. 通过lscpu获取物理核心数
  2. /proc/loadavg读取15分钟平均负载
  3. 计算负载率百分比:(load1+load2+load3)/(3*cores)*100
  4. 使用bc进行精确数学计算

2.2.3 HTML动态生成引擎

bash 复制代码
generate_html_table() {
    echo "<table>"
    head -1 "${file}" | awk -F'|' '{/* 生成表头 */}
    tail -n +2 "${file}" | awk -F'|' '{/* 生成表格行 */}'
    echo "</table>"
}

技术亮点

  • 使用AWK流式处理CSV文件
  • 动态生成HTML表格结构
  • 支持自动列宽适配

三、核心代码解析

3.1 配置区域

bash 复制代码
##############################################
#              配置区域(用户可修改)
##############################################
REPORT_TITLE="Linux系统健康检查报告"        # 报告标题
MAX_PROCESS=10                            # TOP进程显示数量
STYLE_CRITICAL="color:#FF4444;font-weight:bold"  # 危急状态样式
STYLE_WARNING="color:#FF9900"             # 警告状态样式

参数说明

  • MAX_PROCESS:控制进程列表显示数量
  • STYLE_*:自定义不同告警级别的CSS样式

3.2 内存采集模块

bash 复制代码
collect_memory_info() {
    free -b | awk '
    /Mem/ {
        total=$2      # 总内存(bytes)
        used=$3       # 已用内存
        rate=int(used/total*100)  # 使用率计算
        # 状态判断逻辑
        status=(rate>90)?"危急":(rate>70)?"警告":"正常"
        printf "物理内存|%s|%s|%d%%|%s\n", 
            $2, $3, rate, status
    }'
}

功能解析

  1. 使用free -b获取字节级精确内存数据
  2. 通过AWK计算内存使用率
  3. 三级状态判断(正常/警告/危急)

3.3 进程采集模块

bash 复制代码
collect_process_info() {
    ps -eo pid,user,%cpu,%mem,comm --sort=-%cpu | 
    head -n $((MAX_PROCESS+1)) |  # 保留表头
    awk 'NR>1 {printf "%s|%s|%.1f|%.1f|%s\n", $1, $2, $3, $4, $5}'
}

实现要点

  • --sort=-%cpu:按CPU使用率降序排序
  • head控制显示进程数量
  • NR>1过滤掉表头行

四、应用场景案例

4.1 日常巡检自动化

使用方式

bash 复制代码
# 批量执行脚本示例
for ip in 192.168.1.{100..120}; do
    ssh root@$ip "wget http://tools/sysinfo.sh && chmod +x sysinfo.sh && ./sysinfo.sh"
    scp root@$ip:/root/report.html ./reports/${ip}.html
done

效果

  • 自动生成集群服务器健康报告
  • 统一存档便于历史对比

4.2 故障快速定位

典型场景

  • CPU负载突增 → 查看TOP进程列表
  • 内存使用告警 → 检查内存趋势图表
  • 磁盘空间不足 → 定位具体分区

优势体现

  1. 异常指标自动高亮显示
  2. 关键数据聚合展示
  3. 快速定位问题根源

五、工具使用指南

5.1 基础使用

bash 复制代码
# 赋予执行权限
chmod +x sysinfo.sh

# 执行采集(需要root权限)
sudo ./sysinfo.sh

# 生成报告示例
localhost_system_report.html

5.2 报告解读

指标项 正常范围 告警阈值
CPU负载率 <70% >90%(红色)
内存使用率 <80% >90%(红色)
磁盘使用率 <85% >95%(红色)

六、扩展开发建议

6.1 添加邮件通知

bash 复制代码
# 在main函数末尾添加:
send_email() {
    echo "邮件发送中..."
    mutt -s "【系统报告】${HOSTNAME}" [email protected] -a "${output_file}"
}

6.2 对接监控系统

bash 复制代码
# 生成Prometheus格式数据
generate_metrics() {
    awk -F'|' 'NR>1 {print $1,$2}' "${TMP_DIR}/cpu.csv" | \
    while read metric value; do
        echo "system_${metric,,}{host=\"${HOSTNAME}\"} ${value}"
    done > metrics.prom
}

6.3 增加历史对比

bash 复制代码
# 添加历史数据存储
archive_report() {
    local history_dir="/var/log/system_reports"
    mkdir -p "${history_dir}"
    cp "${output_file}" "${history_dir}/${HOSTNAME}-$(date +%Y%m%d).html"
}

七、完整脚本

7.1 依赖包

复制代码
yum -y install bc sysstat net-tools

7.2 脚本

shell 复制代码
#!/bin/bash
# Author: 曼岛_
# Version: 2.2.0
# sysinfo.sh
# 功能:Linux系统信息收集与HTML报告生成工具
# 特点:快速执行/零依赖/多维度监控/可视化展示

##############################################
#              配置区域(用户可修改)
##############################################
REPORT_TITLE="Linux系统健康检查报告"        # 报告标题
MAX_PROCESS=10                            # 显示TOP进程数量
STYLE_CRITICAL="color:#FF4444;font-weight:bold"  # 告警样式
STYLE_WARNING="color:#FF9900"             # 警告样式

##############################################
#              初始化环境
##############################################
TMP_DIR=$(mktemp -d -t sysinfo-XXXXXX)     # 创建临时目录
trap 'cleanup' EXIT                       # 设置退出清理

# CSS样式表
readonly CSS_STYLE='
<style>
    body { font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; }
    .dashboard { padding: 20px; background: #f5f5f5; }
    .card { 
        background: white; 
        border-radius: 8px;
        box-shadow: 0 2px 4px rgba(0,0,0,0.1);
        margin-bottom: 20px;
        padding: 15px;
    }
    table { width: 100%; border-collapse: collapse; }
    th { background: #0033FF; color: white; padding: 8px; }
    td { padding: 8px; border-bottom: 1px solid #ddd; }
    .progress { 
        background: #eee; 
        height: 20px;
        border-radius: 10px;
        overflow: hidden;
    }
    .progress-bar {
        height: 100%;
        background: #28a745;
        transition: width 0.3s ease;
    }
</style>
'

##############################################
#              核心函数库
##############################################

# 环境清理函数
cleanup() {
    rm -rf "${TMP_DIR}"
    echo "[INFO] 临时文件已清理"
}

# 依赖检查函数
check_dependencies() {
    local required=("awk" "free" "df" "lscpu")
    for cmd in "${required[@]}"; do
        if ! command -v "${cmd}" &> /dev/null; then
            echo "[ERROR] 缺少依赖命令: ${cmd}"
            exit 1
        fi
    done
}

# CPU信息采集
collect_cpu_info() {
    {
        echo "项目|值|状态"
        # 获取CPU核心数
        local cores=$(lscpu | grep '^CPU(s):' | awk '{print $2}')
        # 获取负载信息
        local load=$(awk '{print $1,$2,$3}' /proc/loadavg)
        # 计算负载率
        local load_percent=$(echo "scale=0; 100 * ${load// /+} / ${cores}" | bc)
        
        # 生成状态标记
        if [ $(echo "${load_percent} > 90" | bc) -eq 1  ]; then
            local status="<span style='${STYLE_CRITICAL}'>危急</span>"
        elif [ $(echo "${load_percent} > 70" | bc) -eq 1  ]; then
            local status="<span style='${STYLE_WARNING}'>警告</span>"
        else
            local status="正常"
        fi

        echo "CPU核心数|${cores}|-"
        echo "15分钟负载|${load}|${status}"
        echo "负载率|${load_percent}%|${status}"
    } > "${TMP_DIR}/cpu.csv"
}
# 内存信息采集
collect_memory_info() {
    {
        echo "类型|总量|已用|空闲|使用率|状态"
        # 使用awk直接处理free命令输出
        free -b | awk '
        /Mem/ {
            total=$2
            used=$3
            free=$4
            rate=int(used/total*100)
            status=(rate>90)?"<span style=\"'"${STYLE_CRITICAL}"'\">危急</span>":(rate>70)?"<span style=\"'"${STYLE_WARNING}"'\">警告</span>":"正常"
            printf "物理内存|%s|%s|%s|%d%%|%s\n", 
                $2, $3, $4, rate, status
        }'
    } > "${TMP_DIR}/memory.csv"
}

# 磁盘信息采集
collect_disk_info() {
    {
        echo "文件系统|类型|总空间|已用|可用|使用率|挂载点|状态"
        # 处理df输出并计算状态
        df -Th | awk '
        NR>1 {
            gsub(/%/,"",$6)
            status=($6>90)?"<span style=\"'"${STYLE_CRITICAL}"'\">危急</span>":($6>70)?"<span style=\"'"${STYLE_WARNING}"'\">警告</span>":"正常"
            printf "%s|%s|%s|%s|%s|%d%%|%s|%s\n",
                $1, $2, $3, $4, $5, $6, $7, status
        }'
    } > "${TMP_DIR}/disk.csv"
}

# 进程信息采集
collect_process_info() {
    {
        echo "PID|用户|CPU%|内存%|命令"
        # 获取进程信息并按CPU排序
        ps -eo pid,user,%cpu,%mem,comm --sort=-%cpu | 
        head -n $((MAX_PROCESS+1)) | 
        awk 'NR>1 {printf "%s|%s|%.1f|%.1f|%s\n", $1, $2, $3, $4, $5}'
    } > "${TMP_DIR}/process.csv"
}

##############################################
#              HTML生成引擎
##############################################

# 生成表格函数
generate_html_table() {
    local title="$1"
    local file="$2"
    
    echo "<div class='card'>"
    echo "<h3>${title}</h3>"
    echo "<table>"
    
    # 生成表头
    head -1 "${file}" | awk -F'|' '{
        printf "<tr>"
        for(i=1;i<=NF;i++) printf "<th>%s</th>", $i
        printf "</tr>"
    }'
    
    # 生成表格内容
    tail -n +2 "${file}" | awk -F'|' '{
        printf "<tr>"
        for(i=1;i<=NF;i++) printf "<td>%s</td>", $i
        printf "</tr>"
    }'
    
    echo "</table></div>"
}

# 生成进度条
generate_progress_bar() {
    local percent=$1
    echo "<div class='progress'>"
    echo "<div class='progress-bar' style='width:${percent}%;background:${2:-"#28a745"}'>"
    echo "</div></div> ${percent}%"
}

# 生成完整报告
generate_report() {
    {
        echo "<!DOCTYPE html>"
        echo "<html><head><meta charset='utf-8'>${CSS_STYLE}</head>"
        echo "<body><div class='dashboard'>"
        echo "<h1>${REPORT_TITLE}</h1>"
        echo "<p>生成时间: $(date +"%Y-%m-%d %H:%M:%S")</p>"
        
        # CPU信息板块
        generate_html_table "CPU监控" "${TMP_DIR}/cpu.csv"
        
        # 内存信息板块
        generate_html_table "内存监控" "${TMP_DIR}/memory.csv"
        
        # 磁盘信息板块
        generate_html_table "磁盘监控" "${TMP_DIR}/disk.csv"
        
        # 进程信息板块
        generate_html_table "TOP进程" "${TMP_DIR}/process.csv"
        
        echo "</div></body></html>"
    } > "${TMP_DIR}/report.html"
}

##############################################
#              主控制流程
##############################################

main() {
    echo "[INFO] 开始收集系统信息..."
    
    # 检查依赖
    check_dependencies
    
    # 采集数据
    collect_cpu_info
    collect_memory_info
    collect_disk_info
    collect_process_info
    
    # 生成报告
    generate_report
    
    # 输出结果
    local output_file="${HOSTNAME}_system_report.html"
    cp "${TMP_DIR}/report.html" "./${output_file}"
    
    echo "[SUCCESS] 报告生成完成 ➜ ${output_file}"
}

# 执行入口
main "$@"

八、报告截图

九、总结与展望

7.1 工具优势

  • 轻量高效:3秒完成全量采集
  • 灵活扩展:模块化设计便于功能增强
  • 开箱即用:无需复杂配置

7.2 未来演进

  1. 增加容器化支持
  2. 开发Web配置界面
  3. 集成钉钉/企业微信通知
  4. 支持自定义采集插件

如果觉得不错,记得点关注哦!

相关推荐
chennalC#c.h.JA Ptho1 小时前
Centos系统详解架构详解
linux·经验分享·笔记·系统架构·系统安全
独行soc2 小时前
2025年渗透测试面试题总结-某步在线面试(题目+回答)
linux·网络·安全·web安全·面试·职场和发展·渗透安全
mixboot2 小时前
ping_test_parallel.sh 并行网络扫描脚本
linux·ping·ip在线扫描
蓑笠翁0012 小时前
Python异步编程入门:从同步到异步的思维转变
linux·前端·python
爱奥尼欧2 小时前
【Linux】Linux工具(1)
linux·运维·服务器
高峰聚焦3 小时前
【Ubuntu】Netplan静态网络配置
linux·运维·ubuntu
冯一川3 小时前
Arm核的Ubuntu系统上安装Wireshark
linux·ubuntu·wireshark
原小明3 小时前
Ubuntu 22.04 出现 ‘Temporary failure resolving‘ 解决方案
linux·运维
Jerry&Louis3 小时前
【Ubuntu】fcitx5 + Rime(中州韵)好用的Linux中文输入法
linux·ubuntu
o0o_-_3 小时前
【瞎折腾/mi50 32G/ubuntu】mi50显卡ubuntu运行大模型开坑(二)使用llama.cpp部署Qwen3系列
linux·ubuntu·llama