只有一两台机器的时候,上一套 Zabbix 或 Prometheus + Grafana 有点重。用几个脚本 + 告警,能覆盖绝大多数「出事前能发现」的需求。
要监控什么
按重要性排:
- 服务是否活着(HTTP 200)
- 磁盘使用率
- 内存和负载
- 证书到期时间
- 备份是否成功
- 数据库连接数、慢查询
这六项覆盖了个人站点 90% 的故障场景。
最简实现
#!/bin/bash
# /root/monitor/check.sh
ALERT=""
# 1. HTTP
code=$(curl -s -o /dev/null -w '%{http_code}' -m 10 https://kb.mi-blog.cn/)
[ "$code" != "200" ] && ALERT="$ALERT\n站点返回 $code"
# 2. 磁盘
use=$(df / | awk 'NR==2 {gsub(/%/,""); print $5}')
[ "$use" -gt 85 ] && ALERT="$ALERT\n磁盘使用 ${use}%"
# 3. 内存
mem=$(free | awk '/Mem:/ {printf "%.0f", $3/$2*100}')
[ "$mem" -gt 90 ] && ALERT="$ALERT\n内存使用 ${mem}%"
# 4. 负载
load=$(awk '{print int($1)}' /proc/loadavg)
cpu=$(nproc)
[ "$load" -gt $((cpu * 2)) ] && ALERT="$ALERT\n负载 $load($cpu 核)"
# 5. 证书剩余天数
days=$(( ($(date -d "$(openssl s_client -connect kb.mi-blog.cn:443 -servername kb.mi-blog.cn 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)" +%s) - $(date +%s)) / 86400 ))
[ "$days" -lt 15 ] && ALERT="$ALERT\n证书剩余 ${days} 天"
# 6. 服务
systemctl is-active --quiet kb-web || ALERT="$ALERT\nkb-web 未运行"
if [ -n "$ALERT" ]; then
echo -e "[$(hostname)] 告警:$ALERT" | mail -s "服务器告警" you@example.com
fi
cron 每 5 分钟跑一次。
告警渠道
邮件容易被忽略,国内更实用的是:
- 企业微信/钉钉机器人 webhook
- Server 酱推送到微信
- Telegram Bot
webhook 最简单:
curl -s -X POST "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx" \
-H 'Content-Type: application/json' \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$(echo -e $ALERT)\"}}"
加一份历史数据
只告警看不到趋势。把每次采集的结果追加到 CSV,用的时候能画图:
echo "$(date +%F_%T),$use,$mem,$load,$code" >> /root/monitor/metrics.log
出问题时回头看「什么时候开始变差的」,比看单点数值有用得多。
别做的事
- 不要每分钟查一次全站,自己给自己制造压力
- 不要告警风暴,同一个问题连续告警会让人麻木。加个状态去重:上次已告警且未恢复,就跳过
- 不要只监控不处理,告警没人看等于没监控
一个心态
监控的价值不是「画得漂亮」,是「出事之前有人知道」。哪怕只有一条 curl 检查,只要真的会通知到人,就比一堆没配告警的仪表盘有用。
- THE END -
最后修改:2025年11月8日
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://mi-blog.cn/archives/703
共有 0 条评论