在主机选的运维实战中,VPS 磁盘写满导致数据库锁死或服务崩溃是最常见的低级故障。与其每天手动登录敲 `df -h` 巡检,不如花十分钟部署一个自动化监控方案。本文将教你如何编写一个 Shell 脚本作为监控 Agent,配合 Telegram Bot 实现磁盘使用率超过 80% 时自动报警,甚至可以利用 Claude Code 等 AI Agent 快速生成和优化这段代码。

VPS 磁盘监控方案与 Telegram Bot 配置
这个方案的核心在于“轻量”和“即时”。不需要安装 Zabbix 或 Prometheus 这样的重型监控系统,直接利用系统自带的 `df` 命令配合 Telegram API 即可。Telegram 的优势在于消息推送极其迅速,且支持 Markdown 格式,非常适合接收简单的报警信息。
创建 Telegram Bot 并获取 Token
Telegram 的 Bot 由官方的 BotFather 管理。打开 Telegram 搜索 `@BotFather`,发送 `/newbot` 按提示创建一个新机器人。创建完成后,BotFather 会发给你一串 Token,格式通常为 `123456789:ABCdefGHIjklMNOpqrsTUVwxyz`。
安全提示:这串 Token 相当于机器人的密码,切勿直接提交到 GitHub 等公开仓库,建议在服务器环境变量中保存。
获取个人 Chat ID
脚本需要知道把消息发给谁。你需要获取自己的 Chat ID。新建一个 Telegram Bot,随便给它发一条消息(例如“hello”),然后在浏览器访问以下链接(将 `<YOUR_BOT_TOKEN>` 替换为上一步的 Token):
`https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates`
浏览器会返回一段 JSON 数据,在其中找到 `"chat":{"id":123456789`,这里的 `123456789` 就是你的 Chat ID。如果是群组,记得先把机器人拉进群组发消息后再获取 ID。
编写磁盘监控 Shell 脚本
脚本的逻辑很简单:检查根分区(或指定挂载点)的使用率,如果超过阈值,就调用 `curl` 向 Telegram API 发送 POST 请求。
脚本逻辑与 df 命令解析
我们主要利用 `df -h` 获取磁盘信息,配合 `awk` 或 `sed` 提取百分比。以下是一个基础的脚本示例:
#!/bin/bash
TELEGRAM_TOKEN="你的_BOT_TOKEN"
CHAT_ID="你的_CHAT_ID"
THRESHOLD=80 # 报警阈值设置为 80%
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$DISK_USAGE" -gt "$THRESHOLD" ]; then
MESSAGE="⚠️ 警告:VPS 磁盘空间不足!
主机:$(hostname)
当前使用率:${DISK_USAGE}%
挂载点:/
请及时清理日志或扩容。"
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage" \
-d chat_id="${CHAT_ID}" \
-d text="${MESSAGE}" \
-d parse_mode="Markdown"
fi
这段脚本首先定义了 Token 和阈值,然后提取根目录 `/` 的使用率。注意 `awk 'NR==2 {print $5}'` 这一行,它是为了精准定位 `df` 输出结果的第二行第五列(即使用率),避免表头干扰。
利用 Claude Code 或 AI Agent 辅助生成
如果你觉得手动写脚本麻烦,或者想增加更复杂的逻辑(比如检查 Inode 使用率、判断特定目录大小),可以直接使用 Claude Code、Cursor 或其他 AI Agent 辅助编写。你可以给 AI 下达这样的 Prompt:“帮我写一个 Shell 脚本,监控 VPS /var/log 目录大小,如果超过 5GB 就调用 Telegram Webhook 发送消息,并输出最近修改的 5 个大文件”。AI 生成的代码通常可以直接使用,只需填入你的 API Key 即可。
部署监控 Agent 与 Crontab 定时任务
脚本写好后,它只是一个静态文件,需要交给系统的定时任务 Crontab 来调度执行,让它变成一个真正的“监控 Agent”。
赋予执行权限与调试
先将脚本保存到 `/usr/local/bin/disk_alert.sh`,并赋予执行权限:
chmod +x /usr/local/bin/disk_alert.sh
在加入定时任务前,务必手动运行一次脚本测试:
/usr/local/bin/disk_alert.sh
如果此时你的磁盘确实超过了 80%,手机应该会立刻收到 Telegram 消息。如果没有收到,检查脚本的语法错误(运行 -n /usr/local/bin/disk_alert.sh`)或 Token 是否正确。
配置 Crontab 实现自动化
使用 `crontab -e` 编辑当前用户的定时任务。建议不要直接使用 root 跑脚本,除非脚本必须访问 root 权限的目录。添加以下行:
*/30 * * * * /usr/local/bin/disk_alert.sh
保存退出后,Crontab 会自动加载。为了确保调试信息不丢失,可以在脚本路径后加上日志重定向,例如 `>> /var/log/disk_monitor.log 2>&1`,方便后续排错。
老鸟叮嘱
1.不要只看百分比:有些小分区(如 `/boot`)只有几百 MB,可能只占用了 50% 但空间已经不够用了。监控脚本最好针对具体挂载点(如 `/home` 或 `/var`)进行定制,而不是一刀切。
2.API 频率限制:Telegram Bot API 有速率限制,如果 VPS 很多,不要把所有服务器的检查时间都设在整点或半点,最好在 Crontab 里加上随机延迟,例如 `*/30 * * * * sleep 20; /usr/local/bin/disk_alert.sh`。
3.消息去重:如果磁盘一直维持在 85%,你的手机可能会每半小时响一次。进阶玩法是在脚本里加个锁文件或状态标记,一天只报一次警,直到恢复正常。
4.安全风险:脚本里包含 Token,务必设置文件权限 `chmod 700`,防止同服务器下的其他用户窥探。
FAQ
Q1:为什么我收不到 Telegram 消息?
A:首先检查 Token 和 Chat ID 是否正确。其次,手动运行脚本看是否有报错。如果 VPS 在中国大陆,可能需要检查服务器到 Telegram API 的网络连通性,必要时配置代理。
Q2:除了磁盘,还能监控 CPU 或内存吗?
A:可以。获取 CPU 使用率可以用 `top -bn1 | grep "Cpu(s)"`,内存用 `free -m`。逻辑一样,提取数值后判断是否超过阈值并调用 Webhook。
Q3:可以用微信代替 Telegram 吗?
A:微信没有官方开放的 Bot API,通常需要接入第三方服务(如 Server酱),虽然可行,但稳定性不如 Telegram 的原生 API,且增加了依赖链路。
Q4:脚本误报了怎么办?
A:先确认是否是临时文件(如日志或缓存)暴涨。如果是,可以在脚本里增加自动清理命令,比如 `> /var/log/nginx/access.log`,但在生产环境清理日志前一定要三思。
这套脚本加 Telegram 的组合虽然简单,但在实际生产环境中非常可靠,能有效避免因磁盘爆满导致的严重事故。结合 AI Agent 辅助编写,你甚至可以在几分钟内扩展出监控 Docker 容器状态、数据库连接数等更复杂的自动化运维能力。
转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/10189.html 商家投稿邮箱:zhujixuanblog@qq.com
