小团队和独立开发者的服务器告警需求通常很朴素:磁盘快满、内存吃紧、关键进程挂了,第一时间在微信里收到一条通知,顺便让钉钉群里的同事也看到。为此专门部署一套监控平台,维护成本往往高于收益。
这篇解决方案用最少的组件把链路搭起来:一段 shell 脚本负责检查,crontab 负责定时,WPush 负责把消息送到微信和钉钉。
准备
- 注册 WPush,在「设置」页拿到 API Key;
- 在「渠道」页扫码绑定微信;如需进钉钉群,参考钉钉群机器人接入教程完成绑定;
- 服务器上有
curl。
发送函数
把 WPush 调用封装成一个函数,后面所有检查项共用:
#!/usr/bin/env bash
set -u
WPUSH_KEY="WPUSH_你的APIKey"
CHANNELS="wechat,dingtalk"
HOST="$(hostname)"
notify() {
local title="$1" content="$2"
curl -sS -X POST 'https://api.wpush.cn/api/v1/send' \
--data-urlencode "apikey=${WPUSH_KEY}" \
--data-urlencode "title=${title}" \
--data-urlencode "content=${content}" \
--data-urlencode "channel=${CHANNELS}" >/dev/null
}
检查项
磁盘使用率
check_disk() {
local threshold=85
df -P | awk 'NR>1 && $5+0 > '"$threshold"' {print $6" "$5}' | while read -r mount pct; do
notify "磁盘告警 · ${HOST}" "挂载点 **${mount}** 使用率 ${pct},阈值 ${threshold}%"
done
}
可用内存
check_mem() {
local threshold=90
local used
used=$(free | awk '/Mem:/ {printf "%d", $3/$2*100}')
if [ "$used" -gt "$threshold" ]; then
notify "内存告警 · ${HOST}" "内存使用率 ${used}%,阈值 ${threshold}%"
fi
}
关键进程存活
check_proc() {
for name in nginx mysqld; do
if ! pgrep -x "$name" >/dev/null; then
notify "进程异常 · ${HOST}" "**${name}** 未在运行,请立即检查"
fi
done
}
告警去重
每分钟跑一次检查,磁盘满了之后每分钟都收一条消息是灾难。加一个基于状态文件的冷却期:
STATE_DIR=/var/tmp/wpush-alert
mkdir -p "$STATE_DIR"
# alert_once <key> <title> <content> 同一 key 在 COOLDOWN 秒内只推一次
COOLDOWN=1800
alert_once() {
local key="$1" title="$2" content="$3"
local f="$STATE_DIR/$key" now
now=$(date +%s)
if [ -f "$f" ] && [ $((now - $(cat "$f"))) -lt "$COOLDOWN" ]; then
return
fi
echo "$now" > "$f"
notify "$title" "$content"
}
# 恢复时清掉状态并推一条恢复通知
recover() {
local key="$1" title="$2"
if [ -f "$STATE_DIR/$key" ]; then
rm -f "$STATE_DIR/$key"
notify "$title" "指标已恢复正常"
fi
}
把前面检查项里的 notify 换成 alert_once "disk_${mount//\//_}" ...,并在指标正常的分支调用 recover,就有了完整的告警与恢复闭环。
定时执行
chmod +x /usr/local/bin/wpush-check.sh
echo '* * * * * root /usr/local/bin/wpush-check.sh' > /etc/cron.d/wpush-check
已有监控平台怎么接
如果你已经在用 Prometheus Alertmanager、Grafana、Uptime Kuma 等工具,不需要写脚本:它们都支持 Webhook 通知,把通知地址指向一个转发到 WPush 的小服务即可。WPush 的 Webhook 渠道方向相反,是 WPush 把消息推给你,二者不要混淆。
效果
微信会收到一条模板消息,点开可见完整 Markdown 正文;钉钉群里同时出现同一条消息。用返回的消息 ID 调 query 接口可以核对每个渠道的投递状态。
常见问题
一定要部署 Prometheus 或 Zabbix 才能用 WPush 发告警吗?
不需要。任何能发 HTTP 请求的地方都可以调用 WPush,一段 shell 脚本配 crontab 就够用。已有监控平台的话,把它的 Webhook 通知指向 WPush 即可。
同一个告警会不会反复推送?
取决于你的脚本。文中的示例用一个状态文件记录上次告警时间,同一指标在冷却期内不再重复推送,恢复时再推一条恢复通知。
告警可以同时发到多个渠道吗?
可以。channel 参数支持逗号分隔,比如 wechat,dingtalk 会同时推到微信和钉钉群,只需一次调用。
现在就把第一条消息推出去
注册 WPush,扫码绑定微信即可收到推送。一次 API 调用同时送达 10 个渠道,内置 MCP Server 与 Agent Skill。