1. 项目概述
作为一名运维工程师,我经常需要手动检查服务器的各项指标。每次登录服务器执行相同的命令查看CPU、内存、磁盘使用情况,不仅效率低下,还容易遗漏关键指标。为了解决这个问题,我开发了一个自动化巡检脚本,能够一键生成全面的服务器健康报告,并支持定时执行自动生成日志文件。
这个脚本的核心价值在于:
- 将原本需要10-15分钟的手动检查过程缩短到1秒内完成
- 标准化巡检内容,避免人为遗漏重要指标
- 通过颜色标记异常项,快速定位问题
- 支持定时任务,实现无人值守巡检
2. 脚本设计与实现
2.1 脚本架构设计
整个脚本采用模块化设计,主要包含以下功能模块:
- 系统信息模块:采集主机名、操作系统版本、内核版本等基础信息
- CPU监控模块:检查CPU核心数、负载情况
- 内存监控模块:监控物理内存和Swap使用情况
- 磁盘空间模块:检查各挂载点使用率
- 网络信息模块:获取IP地址和监听端口
- 用户与进程模块:显示登录用户和资源占用TOP10进程
每个模块都设置了合理的阈值判断,当指标超过阈值时会以红色高亮显示警告信息。
2.2 关键代码解析
bash复制#!/bin/bash
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 阈值设置
LOAD_THRESHOLD=10.0
MEM_USAGE_THRESHOLD=90
DISK_USAGE_THRESHOLD=90
这部分代码定义了脚本使用的颜色变量和各项指标的阈值。颜色定义使用ANSI转义码,可以在终端输出彩色文本。阈值设置基于多年运维经验:
- CPU负载阈值设为10(1分钟平均值)
- 内存使用率阈值设为90%
- 磁盘使用率阈值设为90%
提示:这些阈值可以根据服务器实际配置调整。对于生产环境的关键服务器,建议设置更保守的阈值(如内存80%,磁盘85%)。
3. 核心功能实现
3.1 CPU监控实现
bash复制# CPU信息检查
CPU_CORES=$(grep -c ^processor /proc/cpuinfo)
LOAD_AVERAGE=$(uptime | awk -F'load average:' '{print $2}')
LOAD_1MIN=$(echo ${LOAD_AVERAGE} | awk '{print $1}' | tr -d ',')
if (( $(echo "${LOAD_1MIN} > ${LOAD_THRESHOLD}" | bc -l) )); then
echo -e "${RED}[警告] 1分钟内CPU平均负载 (${LOAD_1MIN}) 超过阈值 (${LOAD_THRESHOLD})!${NC}"
fi
这段代码实现了:
- 通过/proc/cpuinfo获取CPU核心数
- 使用uptime命令获取系统负载平均值
- 使用bc进行浮点数比较判断是否超阈值
- 超阈值时输出红色警告信息
3.2 内存监控实现
bash复制# 内存信息检查
MEM_USAGE_PERCENT=$(free -m | awk 'NR==2{printf "%.2f", $3*100/$2}')
if (( $(echo "${MEM_USAGE_PERCENT} > ${MEM_USAGE_THRESHOLD}" | bc -l) )); then
echo -e "${RED}[警告] 内存使用率 (${MEM_USAGE_PERCENT}%) 超过阈值 (${MEM_USAGE_THRESHOLD}%)!${NC}"
fi
内存检查的关键点:
- 使用free命令获取内存使用情况
- 通过awk计算使用百分比
- 同样使用bc进行阈值比较
- 同时检查物理内存和Swap空间使用情况
4. 定时任务配置
4.1 定时任务设置方法
bash复制(crontab -l 2>/dev/null; echo "0 8 * * * /home/health_check.sh > /home/health_reports/report_\$(date +\%Y\%m\%d).log 2>&1") | crontab -
这条命令实现了:
- 保留现有的crontab任务(crontab -l)
- 添加新的定时任务(echo部分)
- 将结果通过管道写回crontab
定时任务设置为每天8:00执行,输出重定向到以日期命名的日志文件中。
4.2 crontab参数详解
| 参数 | 位置 | 取值范围 | 含义 |
|---|---|---|---|
| 0 | 分钟 | 0-59 | 第0分钟 |
| 8 | 小时 | 0-23 | 早上8点 |
| * | 日期 | 1-31 | 每天 |
| * | 月份 | 1-12 | 每月 |
| * | 星期 | 0-7 | 每天(0和7都表示周日) |
注意:脚本路径和日志路径需要根据实际情况修改。建议使用绝对路径避免执行时找不到文件。
5. 使用技巧与优化建议
5.1 脚本使用步骤
- 将脚本保存为health_check.sh
- 赋予执行权限:
chmod +x health_check.sh - 测试运行:
./health_check.sh - 设置定时任务(可选)
5.2 常见问题解决
问题1:脚本执行报错"Permission denied"
- 原因:没有执行权限
- 解决:
chmod +x health_check.sh
问题2:定时任务没有执行
- 检查方法:
- 查看cron日志:
grep CRON /var/log/syslog - 检查crontab列表:
crontab -l - 检查脚本路径是否正确
- 查看cron日志:
问题3:输出日志中文乱码
- 解决:在脚本开头添加
export LANG=zh_CN.UTF-8
5.3 高级优化建议
- 邮件报警功能:当检测到异常时自动发送邮件通知
bash复制if [ 异常条件 ]; then
echo "警报内容" | mail -s "服务器异常警报" admin@example.com
fi
- 历史数据对比:记录每次检查结果,实现趋势分析
bash复制# 在报告尾部添加历史对比
echo -e "\n--- 历史对比 ---"
tail -n 3 /home/health_reports/*.log | grep "内存使用率"
- 远程执行支持:通过SSH在多台服务器上执行
bash复制for server in server1 server2 server3; do
ssh $server "/path/to/health_check.sh" > report_${server}.log
done
6. 脚本扩展与定制
6.1 添加新的监控项
如果需要监控其他指标,可以按照现有模块的模式添加。例如监控Nginx进程:
bash复制# Nginx进程检查
NGINX_PROCESS=$(pgrep nginx | wc -l)
if [ $NGINX_PROCESS -eq 0 ]; then
echo -e "${RED}[警告] Nginx进程未运行!${NC}"
fi
6.2 调整输出格式
可以根据需要修改报告的输出格式,例如生成HTML报告:
bash复制echo "<html><body>"
echo "<h1>服务器健康报告</h1>"
echo "<p>生成时间: $(date)</p>"
echo "<h2>CPU信息</h2>"
echo "<p>核心数: $CPU_CORES</p>"
echo "</body></html>"
6.3 集成到监控系统
可以将脚本输出与Prometheus、Zabbix等监控系统集成:
bash复制# 输出Prometheus格式的指标
echo "# HELP cpu_load CPU负载"
echo "# TYPE cpu_load gauge"
echo "cpu_load $LOAD_1MIN"
7. 安全注意事项
- 脚本存放位置:建议放在/usr/local/bin等安全目录,避免误删
- 文件权限:设置适当的权限(如750),防止未授权修改
- 日志轮转:配置logrotate防止日志文件过大
bash复制# /etc/logrotate.d/health_report
/home/health_reports/*.log {
daily
rotate 30
compress
missingok
notifempty
}
- 敏感信息保护:脚本中不要包含密码等敏感信息
通过这个自动化巡检脚本,我成功将服务器监控效率提升了90%以上,问题发现时间从小时级缩短到分钟级。这个脚本已经在我们团队内部广泛使用,成为日常运维工作中不可或缺的工具。