本文目录导读:

Shell脚本自动化生成每日巡检报告:从入门到企业级实践
目录导读
- 为什么需要每日巡检报告?
- Shell脚本巡检报告的核心构成
- 实战:构建一个完整的巡检脚本
- 报告格式优化与自动发送
- 常见问题与最佳实践
- 问答环节:解决你的核心疑惑
为什么需要每日巡检报告?
在运维工作中,每日巡检是保证系统稳定性的基础,人工巡检存在效率低、易遗漏等痛点,通过Shell脚本自动生成巡检报告,可以实现:
- 定时执行:结合cron任务,每天固定时间运行
- 关键指标采集:CPU、内存、磁盘、网络、进程、日志等
- 异常告警:阈值触发时自动标注
- 存档追溯:报告按日期归档,方便历史对比
根据业务规模,一份完整的巡检报告通常包含:系统资源使用率、关键服务状态、安全日志摘要、近期异常事件。
Shell脚本巡检报告的核心构成
1 基础环境模块
#!/bin/bash # 定义报告存放路径 REPORT_DIR="/var/log/daily_check" REPORT_FILE="$REPORT_DIR/report_$(date +%Y%m%d).html" HOSTNAME=$(hostname) DATE=$(date '+%Y-%m-%d %H:%M:%S')
2 数据采集模块
需采集的关键指标包括:
- CPU:
top -bn1 | grep "Cpu(s)" - 内存:
free -m | awk 'NR==2' - 磁盘:
df -h | grep -E '^/dev/' - 网络:
ping -c 2 www.example.com(改成域名,此处用示例域名www.testdomain.com) - 进程:
ps aux --sort=-%mem | head -10 - 日志:检查
/var/log/messages中的error级别(用grep -i error)
3 异常检测算法
设定阈值(CPU使用率>90%、磁盘使用率>80%),在脚本中用 if 判断,将异常项用红色标记。
实战:构建一个完整的巡检脚本
1 脚本框架(时间戳与头部)
#!/bin/bash # 生成HTML格式报告 echo "<html><head><title>每日巡检报告 - $DATE</title></head><body>" > $REPORT_FILE echo "<h2>巡检日期: $DATE</h2>" >> $REPORT_FILE
2 采集CPU并判断
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
if (( $(echo "$CPU_USAGE > 90" | bc -l) )); then
echo "<p style='color:red;'>⚠ CPU使用率过高: $CPU_USAGE%</p>" >> $REPORT_FILE
else
echo "<p>CPU使用率: $CPU_USAGE%</p>" >> $REPORT_FILE
fi
3 磁盘使用率检查
df -h | grep -E '^/dev/' | while read line; do
USE=$(echo $line | awk '{print $5}' | cut -d'%' -f1)
if [ $USE -gt 80 ]; then
echo "<p style='color:red;'>磁盘空间告警: $line</p>" >> $REPORT_FILE
fi
done
4 网络连通性测试
if ping -c 2 www.yourdomain.com &> /dev/null; then
echo "<p>外网访问正常</p>" >> $REPORT_FILE
else
echo "<p style='color:red;'>外网无法访问</p>" >> $REPORT_FILE
fi
5 结束标记
echo "</body></html>" >> $REPORT_FILE
报告格式优化与自动发送
1 HTML美化技巧
- 使用
<table>将数据对齐 - 添加
css样式(如背景色、边框) - 嵌入
图表(使用gnuplot或ASCII图表,或者链接到hichart/echarts外部库)
2 自动发送邮件
安装 mailutils 或 mutt,在脚本末尾添加:
mail -s "每日巡检报告 - $(date +%Y%m%d)" youremail@domain.com < $REPORT_FILE
注意:确保邮件服务器配置正确,或使用 sendmail 命令。
3 定时任务配置
# crontab -e 添加下面一行,每天早9点执行 0 9 * * * /path/to/daily_check.sh
常见问题与最佳实践
1 脚本执行权限
chmod +x /path/to/script.sh
2 报告文件轮转
使用 logrotate 或脚本内删除30天前的旧报告:
find $REPORT_DIR -name "*.html" -mtime +30 -exec rm {} \;
3 性能优化
- 避免在高峰时段执行(建议凌晨执行并发送历史报告)
- 只采集关键指标,减少对系统资源的占用
4 安全考虑
- 使用普通用户运行脚本(避免root权限暴露)
- 敏感信息(如数据库密码)不要硬编码,建议使用环境变量或加密文件
问答环节:解决你的核心疑惑
问1:脚本生成的HTML在浏览器中显示乱码怎么办?
答:在HTML头部加上 <meta charset="UTF-8">,并确保系统语言环境支持中文(如 LANG=zh_CN.UTF-8)。
问2:如何让报告包含服务器历史趋势?
答:在脚本中读取昨天的报告,对比当前值和历史值,计算变化率,记录 /tmp/cpu_usage.log 文件,将当前值追加到文件末尾,并用 tail -2 比较。
问3:生产环境中,我需要监控上百台服务器,用独立脚本还是集中管理?
答:建议采用集中式巡检系统(如Ansible、SaltStack),通过 ansible all -m script -a "/path/check.sh" 批量执行,然后收集报告到中央服务器,如果有域名,改成 ansible all -m script -a "/opt/check.sh"。
问4:报告中的磁盘报警经常误报,如何优化阈值?
答:针对根分区(/)设95%阈值,针对数据分区(如/data)设85%阈值,同时增加“预测功能”:根据磁盘增长速率(如过去7天平均每天增长0.5%),提前三天告警。
问5:能否通过Shell脚本直接生成PDF报告?
答:可以借助 wkhtmltopdf 工具,将HTML转为PDF:wkhtmltopdf $REPORT_FILE $REPORT_DIR/report_$(date +%Y%m%d).pdf,注意:需要提前安装该工具。
通过以上步骤,你已经掌握如何使用Shell脚本构建一套完整的每日巡检报告系统,核心思想是:自动化采集 → 阈值判断 → 结构化呈现 → 定时发送,实际部署时,建议先从单台服务器开始测试,确认无误后再批量推广,如果你需要更高级的功能(如可视化图表、异常自愈),可以结合Python或Go语言编写更复杂的巡检模块。