一、工具概述
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)
算法解析:
- 通过
lscpu
获取物理核心数 - 从
/proc/loadavg
读取15分钟平均负载 - 计算负载率百分比:
(load1+load2+load3)/(3*cores)*100
- 使用
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
}'
}
功能解析:
- 使用
free -b
获取字节级精确内存数据 - 通过AWK计算内存使用率
- 三级状态判断(正常/警告/危急)
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进程列表
- 内存使用告警 → 检查内存趋势图表
- 磁盘空间不足 → 定位具体分区
优势体现:
- 异常指标自动高亮显示
- 关键数据聚合展示
- 快速定位问题根源
五、工具使用指南
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 未来演进
- 增加容器化支持
- 开发Web配置界面
- 集成钉钉/企业微信通知
- 支持自定义采集插件
如果觉得不错,记得点关注哦!