服务器电话告警配置:用脚本实现拨号通知
服务器电话告警配置的核心思路是:在服务器上运行一个检测脚本,当发现异常指标时,调用第三方语音接口拨打电话。
本文以 Linux 系统为例,用 Shell 脚本和 crontab 实现这一流程,零基础也能照着做。
先确定告警渠道和触发条件
电话告警本身不复杂,但需要先明确两件事:
- 通过什么接口打电话:常见做法是使用支持 HTTP 请求的语音通知服务,脚本里用
curl调用该接口的 URL,传入手机号和告警内容。具体接口地址和参数格式以你选择的服务商文档为准。 - 什么情况触发:例如 CPU 负载超过阈值、磁盘使用率超过 90%、关键进程消失等。建议先用简单指标跑通流程,再逐步增加检测项。
注意:本文不推荐具体服务商,你需要自行准备一个可用的语音通知接口,并拿到调用所需的 URL 和参数。
服务器端准备工作
登录服务器后,先确认以下条件满足:
- 系统已安装
curl,可用curl --version检查。 - 有一个可写的脚本存放目录,例如
/opt/scripts/。 - 服务器能访问外网,因为要调用外部 HTTP 接口。
创建目录并进入:
mkdir -p /opt/scripts
cd /opt/scripts
编写电话告警脚本
新建脚本文件 phone_alert.sh,内容示例如下:
#!/bin/bash
# 告警手机号,多个号码用逗号分隔
PHONE="13800000000"
# 语音接口地址,替换为你实际的服务商 URL
API_URL="https://example.com/voice/api"
# 检测磁盘使用率,超过 90% 则触发
THRESHOLD=90
USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$USAGE" -gt "$THRESHOLD" ]; then
MESSAGE="服务器磁盘使用率已达 ${USAGE}%,请及时处理"
curl -s -X POST "$API_URL" \
-d "phone=$PHONE" \
-d "content=$MESSAGE"
echo "$(date) 已触发电话告警:$MESSAGE" >> /var/log/phone_alert.log
fi
关键点说明:
df /取根分区使用率,awk和sed负责提取数字。curl的请求方式和参数名必须与服务商文档一致,上面只是示例格式。- 日志写入
/var/log/phone_alert.log,方便后续排查。
保存后赋予执行权限:
chmod +x /opt/scripts/phone_alert.sh
用 crontab 定时执行
编辑当前用户的定时任务:
crontab -e
加入一行,表示每 5 分钟检查一次:
*/5 * * * * /bin/bash /opt/scripts/phone_alert.sh >/dev/null 2>&1
保存退出。
查看任务是否生效:
crontab -l
避坑提醒:
- crontab 环境变量少,脚本里尽量用绝对路径,例如
/bin/bash而不是bash。 - 如果脚本依赖某些环境变量,在脚本开头手动
export。 - 测试阶段可以把频率改为
* * * * *每分钟执行,验证通过后再调回。
手动运行验证与排错
先手动执行脚本,观察输出和日志:
/bin/bash /opt/scripts/phone_alert.sh
cat /var/log/phone_alert.log
如果电话没有拨出,按以下顺序检查:
- 接口是否可达:用
curl -v加上你的接口地址,看能否建立连接。 - 参数是否正确:对照服务商文档,检查手机号格式、参数名、请求方法。
- 权限与路径:确认脚本有执行权限,日志文件可写。
- crontab 是否执行:临时在脚本里加一行
echo test >> /tmp/cron_test.log,看定时任务有没有跑起来。
常见疑问
电话告警和短信告警能同时配置吗?
可以,在脚本里调用两个不同的接口即可,但要注意接口调用频率限制,避免触发服务商的流控。
脚本会不会重复拨打电话?
如果每 5 分钟检测一次且条件持续满足,可能会重复触发。可以在脚本里加入状态判断,例如记录上次告警时间,间隔一段时间内不重复发送。
没有外网访问权限怎么办?
电话告警依赖外部接口,服务器必须能访问外网。如果网络受限,需要先联系网络管理员开通对应域名的出站访问。
最后提醒
服务器电话告警配置的关键在于接口调通和定时任务稳定运行。
建议先用一个测试号码跑通全流程,确认无误后再换成真实接收人。
日常维护时定期查看日志,避免脚本因接口变更或权限问题静默失效。