Linux脚本实时监控服务器异常告警推送

为什么要自己写监控脚本?

很多面板和商业监控工具功能齐全,但在定制化告警、轻量部署或费用敏感的场景下,一个简单的 Linux 脚本就能解决实时监控服务器异常告警推送的需求。
本文从零开始,教你写一个能自动检测 CPU、内存、磁盘和关键进程,并推送到钉钉或邮箱的脚本。

准备工作:确认环境与通知渠道

在写脚本前,先确认三件事:

  • 系统支持:执行 uname -a 查看 Linux 版本,一般 CentOS 7+、Ubuntu 18+ 都兼容。
  • 网络连通性:确保服务器能访问外部网络,以 curl 测试:curl -s https://www.baidu.com > /dev/null && echo "ok"。
  • 通知渠道:
  • 钉钉/企业微信:在群聊中添加机器人,获取 Webhook 地址。
  • 邮件:安装 mailx(yum install mailx -y)并配置发信服务器。

编写通用监控脚本 monitor.sh

创建一个脚本文件 vim /opt/monitor/monitor.sh,填入以下内容,按实际环境调整阈值。

#!/bin/bash
# 定义阈值(单位:百分比、MB、秒)
CPU_THRESHOLD=80
MEM_THRESHOLD=80
DISK_THRESHOLD=90
BOT_URL="你的钉钉webhook地址"
MAIL_TO="admin@example.com"

# 检查CPU使用率
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'.' -f1)
if [ "$CPU_USAGE" -gt "$CPU_THRESHOLD" ]; then
    MESSAGE="CPU 使用率已达 ${CPU_USAGE}%,请关注。"
fi

# 检查内存使用率
MEM_TOTAL=$(free -m | awk '/Mem:/ {print $2}')
MEM_USED=$(free -m | awk '/Mem:/ {print $3}')
MEM_USAGE=$((MEM_USED * 100 / MEM_TOTAL))
if [ "$MEM_USAGE" -gt "$MEM_THRESHOLD" ]; then
    MESSAGE+"\n内存使用率已达 ${MEM_USAGE}%。"
fi

# 检查磁盘使用率
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | cut -d'%' -f1)
if [ "$DISK_USAGE" -gt "$DISK_THRESHOLD" ]; then
    MESSAGE+="\n根分区磁盘使用率已达 ${DISK_USAGE}%。"
fi

# 如果存在告警,则推送
if [ -n "$MESSAGE" ]; then
    # 钉钉推送(Markdown格式)
    curl -s -X POST "$BOT_URL" -H "Content-Type: application/json" -d '{
        "msgtype": "markdown",
        "markdown": {
            "title": "服务器异常告警",
            "text": "### 服务器告警\n" + "'"$MESSAGE"'"
        }
    }'
    # 邮件推送(可选)
    echo "$MESSAGE" | mail -s "服务器异常告警" $MAIL_TO
fi

注意:脚本中的 Webhook 地址和邮箱需要先配置好。
钉钉消息正文里用反引号包裹变量容易出错,建议拼接字符串时使用临时文件。

设置定时任务自动运行

使用 crontab 每 5 分钟执行一次:

chmod +x /opt/monitor/monitor.sh
crontab -e

添加一行:

*/5 * * * * /opt/monitor/monitor.sh > /dev/null 2>&1

保存后,用 crontab -l 确认生效。

避坑指南:脚本编写常见问题

  • 权限不足:脚本必须可执行,否则 cron 无法运行。用 chmod +x 解决。
  • 路径问题:cron 的 PATH 环境变量有限,脚本中所有命令最好使用绝对路径(如 /usr/bin/top),或在脚本开头写 export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin。
  • 告警频率过高:如果服务器持续异常,每 5 分钟发一次告警会刷屏。建议在脚本里记录上次告警时间,若间隔小于 30 分钟则不发。
  • 特殊字符转义:使用 curl 发送 JSON 时,如果消息内容包含空格或引号,需要用双引号和转义处理。推荐用 jq 或 printf 构建数据。

验证脚本是否正常告警

  1. 手动降低阈值,比如将 CPU_THRESHOLD 设为 10,然后执行脚本:bash /opt/monitor/monitor.sh。
  2. 检查钉钉群或收件箱是否收到告警。
  3. 如果没收到,先检查网络:curl -v 你的webhook地址 看返回码。再检查脚本是否有语法错误:bash -n monitor.sh。

常见问题解答(FAQ)

问:脚本跑完没收到通知,排查思路是什么?
答:先手动执行脚本查看控制台输出,确认是否真的触发了告警条件。然后检查 curl 返回结果,如果是 400 或 403,说明 Webhook 地址或消息格式有问题。

问:我想监控特定进程(比如 nginx)挂了才告警,怎么改?
答:在脚本里增加进程检查:if ! pgrep nginx > /dev/null; then MESSAGE+="\nNginx 进程不存在。"; fi。注意 pgrep 需要安装。

问:服务器量多,多个脚本怎么管理?
答:可以将脚本放到 /opt/monitor/,每个服务一个脚本,cron 统一调用。或者使用 Ansible 等工具批量部署。

如果你正在处理 Linux脚本实时监控服务器异常告警推送,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。

分享到:
上一篇
宝塔手机APP远程运维海外独立站点
下一篇
统一SSL证书批量绑定多跨境站点教程
1
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意