系统监控与告警脚本

系统监控与告警脚本是保障Linux系统稳定运行的重要工具,其核心功能在于实时采集关键性能指标(如CPU、内存、磁盘使用率),并在指标超过预设阈值时触发告警机制。以下从配置参数、指标采集、告警触发三个维度解析其实现逻辑与最佳实践。

一、配置参数:灵活定义监控阈值与告警接收方式

配置参数模块是脚本的"控制面板",通过定义关键变量实现监控策略的灵活调整。核心参数包括性能阈值与告警接收人两类:

  • 性能阈值:如CPU_THRESHOLD=80(CPU使用率阈值设为80%)、MEM_THRESHOLD=90(内存使用率阈值设为90%)、DISK_THRESHOLD=85(磁盘使用率阈值设为85%),用户可根据系统负载特性调整数值,平衡监控灵敏度与告警冗余度。
  • 告警接收人:通过ALERT_EMAIL="admin@example.com"定义邮件接收地址,支持多地址配置(如ALERT_EMAIL="admin@example.com,ops@example.com"),确保告警信息可及时触达相关负责人。

参数定义需遵循"可读性优先"原则,变量名应直观反映功能(如CPU_THRESHOLD而非CT),并在脚本头部集中声明,便于后期维护。

二、指标采集:基于命令行工具的高效数据提取

指标采集是脚本的"感知层",需通过Linux命令行工具获取实时系统状态,并进行数据清洗与格式化。以CPU使用率监控为例,典型实现流程如下:

  1. 使用top命令获取原始数据
    通过top -bn1以批处理模式(-b)执行一次(-n1),避免交互式输出干扰。其输出包含系统整体CPU使用率(如%Cpu(s): 85.0 us, 10.0 sy, 0.0 ni...),需提取用户态与系统态使用率之和作为监控指标。

  2. 通过awk过滤关键数值
    结合awk命令提取CPU使用率数值,示例代码:

bash
复制代码
cpu_usage=$(top -bn1 | grep "%Cpu(s)" | awk '{print $2 + $4}')

其中$2对应用户态使用率(us),$4对应系统态使用率(sy),二者之和即为实际CPU负载。

  1. 使用bc处理浮点比较
    Bash原生不支持浮点运算,需通过bc命令实现阈值判断。例如:
bash
复制代码
if (( $(echo "$cpu_usage > $CPU_THRESHOLD" | bc -l) )); then
fi

此处bc -l启用数学库支持,确保浮点比较精度(如85.5 > 80的判断结果为1,代表真)。

内存与磁盘使用率采集逻辑类似:内存监控可通过free -m结合awk提取已用内存占比,磁盘监控可通过df -h配合awk '/^\/dev\// {print $5}'提取挂载点使用率(需注意排除tmpfs等虚拟文件系统)。

三、告警触发:函数封装与定时调度

告警触发模块需实现"检测-通知-记录"闭环,通过函数封装简化重复代码,并结合定时任务实现持续监控。

  1. 告警函数封装
    将邮件发送逻辑封装为send_alert函数,避免代码冗余。示例实现:
bash
复制代码
send_alert() {
local subject="$1"
local message="$2"
echo "$message" | mail -s "$subject" "$ALERT_EMAIL"
}

调用时只需传入主题(如"CPU使用率告警")与消息内容(如"当前CPU使用率:85.2%"),即可触发邮件发送。

  1. 手动测试告警机制
    为验证告警通道可用性,需支持手动触发测试。可在脚本中添加参数判断逻辑:
bash
复制代码
if [ "$1" = "--test" ]; then
send_alert "告警测试" "这是一封测试邮件,若收到则表明告警通道正常。"
exit 0
fi

执行bash monitor.sh --test即可发送测试邮件,快速验证mail命令配置(需确保系统已安装mailutilspostfix等邮件服务)。

  1. 通过crontab实现定时监控
    结合crontab配置周期性执行脚本,典型场景为"每10分钟监控一次",配置如下:
bash
复制代码
*/10 * * * * /path/to/monitor.sh >> /var/log/monitor.log 2>&1

其中*/10 * * * *表示每10分钟执行一次,输出日志重定向至/var/log/monitor.log便于问题排查,2>&1确保错误信息也被记录。

关键注意事项

  • 指标采集命令需考虑兼容性:不同Linux发行版(如CentOS与Ubuntu)的top输出格式可能存在差异,建议通过man top确认字段位置。
  • 避免告警风暴:可添加"冷却时间"逻辑(如记录上次告警时间,10分钟内不重复发送同一指标告警),防止短时间内大量重复告警。
  • 日志轮转:监控日志需配置logrotate(如设置保留30天日志,单个文件最大100MB),避免磁盘空间耗尽。

通过以上三部分设计,系统监控与告警脚本可实现"参数可配、指标精准、告警及时"的核心目标,为Linux系统运维提供自动化保障。实际应用中,需根据业务场景扩展监控维度(如进程存活状态、网络流量),并结合Zabbix、Prometheus等工具构建更完善的监控体系。