一个基于 WordPress 搭建的个人技术博客,专注于 Linux 运维、网络架构、自动化运维、虚拟化、GPU 服务器部署及企业级基础设施实践经验分享。
使用Bash脚本监控Linux服务器资源并自动发送告警到钉钉
使用Bash脚本监控Linux服务器资源并自动发送告警到钉钉

使用Bash脚本监控Linux服务器资源并自动发送告警到钉钉

使用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,确认脚本执行记录和资源数据。
  • 线上指标:观察钉钉群告警消息是否及时、准确;监控服务器实际性能,如通过tophtop验证。
  • 定期维护
    • 调整阈值:根据业务负载变化,修改CPU_THRESHOLDMEM_THRESHOLD
    • 更新Webhook:钉钉机器人token变更时更新脚本。
    • 优化脚本:如增加磁盘监控、网络监控等功能。

8. 常见坑与排查

  • 脚本执行权限问题
    • 坑:运行脚本时报Permission denied
    • 排查:使用chmod +x monitor_server.sh添加执行权限。
  • 钉钉API限流
    • 坑:频繁告警导致钉钉Webhook被限流,消息发送失败。
    • 排查:降低crontab频率(如每5分钟一次),或在脚本中添加延时逻辑。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

+ 3 = 9