使用Bash脚本监控Linux服务器资源并自动发送告警到钉钉
1. 业务场景与目标
中小企业通常有多台Linux服务器运行关键业务,如Web服务或数据库。手动登录服务器检查资源使用情况效率低下,容易错过异常。本方案的目标是:通过Bash脚本自动监控CPU和内存使用率,当超过阈值(如CPU>80%、内存>90%)时,自动发送告警消息到钉钉群,实现7×24小时无人值守监控,提升运维响应速度。
2. 环境准备(uv + 依赖)
本任务基于Bash脚本,无需uv或Python依赖,但需要以下环境:
- Linux服务器(如Ubuntu 20.04+或CentOS 7+)
- Bash shell(通常默认安装)
- curl命令(用于发送HTTP请求到钉钉)
- 钉钉群聊并创建自定义机器人Webhook(获取Webhook URL)
检查环境:
# 检查Bash版本
bash --version
# 检查curl是否安装
curl --version
# 如果没有curl,安装它(以Ubuntu为例)
sudo apt update && sudo apt install curl -y
3. 数据说明(真实数据口径或模拟数据生成逻辑)
监控数据来自Linux系统的实时资源使用情况:
- CPU使用率:通过
top或/proc/stat计算,本脚本使用top -bn1获取,输出为百分比(如85.5%)。 - 内存使用率:通过
free命令获取,计算已用内存占总内存的比例,输出为百分比(如92.3%)。 - 阈值设置:CPU阈值默认80%,内存阈值默认90%,可根据业务需求调整。
- 模拟数据:如需测试,可临时修改脚本,硬编码高使用率值来触发告警。
4. 训练/实现步骤(完整代码)
创建一个Bash脚本monitor_server.sh,实现监控和告警功能。
#!/bin/bash
# 钉钉Webhook URL,替换为你的实际URL
DINGTALK_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=your_token_here"
# 阈值设置
CPU_THRESHOLD=80 # CPU使用率阈值,百分比
MEM_THRESHOLD=90 # 内存使用率阈值,百分比
# 获取当前时间
CURRENT_TIME=$(date "+%Y-%m-%d %H:%M:%S")
# 获取CPU使用率(使用top命令,取第一行,解析空闲百分比后计算使用率)
CPU_INFO=$(top -bn1 | grep "%Cpu(s)")
CPU_IDLE=$(echo $CPU_INFO | awk -F ' ' '{print $8}' | cut -d '.' -f1)
CPU_USAGE=$((100 - CPU_IDLE))
# 获取内存使用率(使用free命令,计算已用/总内存比例)
MEM_INFO=$(free | grep Mem)
MEM_TOTAL=$(echo $MEM_INFO | awk '{print $2}')
MEM_USED=$(echo $MEM_INFO | awk '{print $3}')
MEM_USAGE=$((MEM_USED * 100 / MEM_TOTAL))
# 初始化告警消息
ALERT_MESSAGE=""
# 检查CPU使用率是否超过阈值
if [ $CPU_USAGE -gt $CPU_THRESHOLD ]; then
ALERT_MESSAGE="CPU使用率: ${CPU_USAGE}% (阈值: ${CPU_THRESHOLD}%)"
fi
# 检查内存使用率是否超过阈值
if [ $MEM_USAGE -gt $MEM_THRESHOLD ]; then
if [ -n "$ALERT_MESSAGE" ]; then
ALERT_MESSAGE="${ALERT_MESSAGE}\n内存使用率: ${MEM_USAGE}% (阈值: ${MEM_THRESHOLD}%)"
else
ALERT_MESSAGE="内存使用率: ${MEM_USAGE}% (阈值: ${MEM_THRESHOLD}%)"
fi
fi
# 如果有告警,发送到钉钉
if [ -n "$ALERT_MESSAGE" ]; then
# 构建钉钉消息JSON
MESSAGE="服务器资源告警 - ${CURRENT_TIME}\n${ALERT_MESSAGE}"
JSON_DATA='{"msgtype": "text", "text": {"content": "'"$MESSAGE"'"}}'
# 发送POST请求到钉钉Webhook
curl -s -H "Content-Type: application/json" -X POST -d "$JSON_DATA" "$DINGTALK_WEBHOOK"
# 输出日志(可选)
echo "[$CURRENT_TIME] 告警已发送: $ALERT_MESSAGE" >> /var/log/server_monitor.log
else
# 无告警时记录正常日志(可选)
echo "[$CURRENT_TIME] 资源正常: CPU ${CPU_USAGE}%, 内存 ${MEM_USAGE}%" >> /var/log/server_monitor.log
fi
保存脚本后,赋予执行权限:
chmod +x monitor_server.sh
5. 调用方式(离线批量 + 单条示例,至少一种)
- 单条示例:直接运行脚本进行一次性监控。
./monitor_server.sh - 离线批量:通过crontab配置定时任务,实现周期性监控(如每分钟一次)。
# 编辑crontab crontab -e # 添加以下行(每分钟执行一次) * * * * * /path/to/monitor_server.sh # 保存并退出,cron会自动运行
6. 指标说明
需关注以下运维指标:
- CPU使用率:服务器处理任务的繁忙程度,超过阈值可能导致服务延迟或崩溃。
- 内存使用率:服务器内存占用比例,过高可能触发OOM(内存溢出)导致进程被杀死。
- 告警准确率:脚本触发告警的正确性,避免误报(正常时告警)或漏报(异常时未告警)。 适用场景:实时监控服务器健康状态,适用于Web服务器、数据库等需要高可用性的环境。
7. 上线后评估
- 离线监控:检查日志文件
/var/log/server_monitor.log,确认脚本执行记录和资源数据。 - 线上指标:观察钉钉群告警消息是否及时、准确;监控服务器实际性能,如通过
top或htop验证。 - 定期维护:
- 调整阈值:根据业务负载变化,修改
CPU_THRESHOLD或MEM_THRESHOLD。 - 更新Webhook:钉钉机器人token变更时更新脚本。
- 优化脚本:如增加磁盘监控、网络监控等功能。
- 调整阈值:根据业务负载变化,修改
8. 常见坑与排查
- 脚本执行权限问题:
- 坑:运行脚本时报
Permission denied。 - 排查:使用
chmod +x monitor_server.sh添加执行权限。
- 坑:运行脚本时报
- 钉钉API限流:
- 坑:频繁告警导致钉钉Webhook被限流,消息发送失败。
- 排查:降低crontab频率(如每5分钟一次),或在脚本中添加延时逻辑。