Shell脚本如何生成每日巡检报告

wen 实用脚本 1

本文目录导读:

Shell脚本如何生成每日巡检报告

  1. 目录导读
  2. 为什么需要每日巡检报告?
  3. Shell脚本巡检报告的核心构成
  4. 实战:构建一个完整的巡检脚本
  5. 报告格式优化与自动发送
  6. 常见问题与最佳实践
  7. 问答环节:解决你的核心疑惑

Shell脚本自动化生成每日巡检报告:从入门到企业级实践

目录导读

  1. 为什么需要每日巡检报告?
  2. Shell脚本巡检报告的核心构成
  3. 实战:构建一个完整的巡检脚本
  4. 报告格式优化与自动发送
  5. 常见问题与最佳实践
  6. 问答环节:解决你的核心疑惑

为什么需要每日巡检报告?

在运维工作中,每日巡检是保证系统稳定性的基础,人工巡检存在效率低、易遗漏等痛点,通过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 数据采集模块

需采集的关键指标包括:

  • CPUtop -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 自动发送邮件

安装 mailutilsmutt,在脚本末尾添加:

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语言编写更复杂的巡检模块。

抱歉,评论功能暂时关闭!