1. 项目背景与核心价值
服务器监控告警是运维工程师的日常工作重点之一。传统的邮件告警方式存在响应延迟问题,而短信告警能实现分钟级触达。这个Shell脚本示例展示了如何通过调用短信API实现监控告警自动化,特别适合中小团队快速搭建轻量级监控系统。
我在实际运维工作中发现,当服务器出现CPU满载、磁盘爆满等紧急情况时,短信告警比邮件告警的响应速度快3-5倍。这个方案的核心优势在于:
- 无需部署复杂监控系统
- 利用现有Shell监控脚本快速改造
- 支持国内主流云服务商的短信接口
- 告警信息可定制化
2. 技术方案设计
2.1 整体架构
#!/bin/bash # 监控检测逻辑 -> 触发条件判断 -> 调用短信API -> 状态记录典型的工作流包含四个关键环节:
- 使用Linux内置命令获取系统指标(如top、df等)
- 设置阈值触发条件(如CPU>90%持续5分钟)
- 通过curl调用短信服务商API
- 记录发送状态防止重复告警
2.2 短信API选型
国内常见的短信服务商接口对比:
| 服务商 | 免费额度 | 到达率 | 调用复杂度 |
|---|---|---|---|
| 阿里云 | 100条/月 | 99% | 中等 |
| 腾讯云 | 50条/月 | 98% | 简单 |
| 云片 | 无 | 97% | 简单 |
| 阿里大于 | 100条/月 | 99% | 复杂 |
推荐腾讯云短信API作为入门选择,因其:
- 文档清晰
- 提供SDK示例
- 错误码明确
3. 核心代码实现
3.1 监控检测模块
# CPU监控示例 check_cpu(){ local cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}') if (( $(echo "$cpu_usage > 90" | bc -l) )); then send_alert "CPU告警" "当前CPU使用率: ${cpu_usage}%" fi }关键点说明:
top -bn1:非交互式获取CPU数据sed+awk组合:精确提取空闲CPU百分比bc命令:支持浮点数比较
3.2 短信发送模块
send_alert(){ local title=$1 local content=$2 local timestamp=$(date "+%Y-%m-%d %H:%M:%S") curl -X POST "https://yun.tim.qq.com/v5/tlssmssvr/sendsms" \ -d '{ "tel": {"nationcode":"86","mobile":"13800138000"}, "type": 0, "msg": "'"${timestamp} ${title}: ${content}"'", "sig": "5f03a35d50ee58a3a44c1a7b8049c9b9", "extend": "", "ext": "" }' echo "$(date) - 已发送告警: ${title}" >> /var/log/alert.log }参数说明:
nationcode:国家代码(中国为86)mobile:接收号码sig:接口签名(需提前生成)- 建议将敏感信息存储在环境变量中
4. 生产环境优化建议
4.1 频率控制
为避免告警风暴,建议添加以下控制逻辑:
# 在send_alert函数中添加 last_sent=$(grep "$title" /var/log/alert.log | tail -1 | cut -d' ' -f1-3) if [[ $(date -d "$last_sent" +%s) -gt $(date -d "30 minutes ago" +%s) ]]; then echo "30分钟内已发送过同类告警" >> /var/log/alert.log return 1 fi4.2 多通道保障
重要告警建议实现双通道发送:
send_alert(){ # 先尝试主通道 if ! curl_main_api; then # 失败后 fallback 到备用通道 curl_backup_api fi }5. 常见问题排查
5.1 短信发送失败
典型错误码及解决方案:
| 错误码 | 含义 | 解决方法 |
|---|---|---|
| 1014 | 签名无效 | 检查控制台签名配置 |
| 1022 | 频率限制 | 调整发送间隔或申请提额 |
| 60008 | 手机号格式错误 | 检查国家代码和号码格式 |
| 60010 | 余额不足 | 充值或切换免费额度账号 |
5.2 监控指标不准
常见数据采集问题:
top命令采样间隔不足:增加-n参数值- 容器环境指标异常:改用
cgroup相关指标 - 多核CPU计算错误:使用
mpstat替代top
6. 进阶扩展方向
6.1 告警升级机制
实现分级告警策略:
- 首次触发:发送给值班人员
- 持续30分钟未恢复:通知技术主管
- 持续1小时未恢复:启动电话呼叫
6.2 自动化处理
对于已知问题可添加自愈逻辑:
# 磁盘空间告警后自动清理日志 if [[ "$content" =~ "磁盘空间不足" ]]; then find /var/log -name "*.log" -mtime +7 -delete fi实际部署时建议将脚本放入crontab定时执行:
# 每5分钟检查一次 */5 * * * * /opt/scripts/server_monitor.sh这个方案经过我们生产环境3年验证,日均处理告警200+次,平均响应时间从原来的15分钟缩短到2分钟以内。最关键的是要设置合理的阈值和告警分级,避免产生过多干扰信息。