Shell脚本自动检测网站连通性
网站偶尔打不开,但等用户反馈时已经晚了。
本文教你用一段Shell脚本定时检测网站是否正常,发现异常自动推送到微信,零基础也能在十分钟内配好。
先想清楚:脚本要检测什么、多久跑一次
核心逻辑很简单:用 curl 访问目标网址,根据返回的HTTP状态码或超时时间判断是否正常。
如果异常,就调用企业微信机器人的Webhook地址发一条消息。
检测频率建议从每5分钟一次开始,既能及时发现故障,又不会给服务器和微信造成压力。
准备工作:拿到Webhook地址和检测目标
你需要在企业微信群里添加一个机器人,操作路径是:群聊 → 右上角更多 → 群机器人 → 添加机器人 → 自定义。
创建后会得到一个类似 https://qyapi.weixin.qq.com/cgi-bin/webhook/send? 的地址,复制保存。
key=你的KEY
同时确定要检测的网址,比如 https://www.example.com。
注意把示例网址换成你自己的真实域名。
编写检测脚本
在服务器上创建脚本文件,路径建议放在 /opt/scripts/check_site.sh。
#!/bin/bash
WEBHOOK="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的KEY"
URL="https://你的域名"
TIMEOUT=10
HTTP_CODE=$(curl -o /dev/null -s -w "%{http_code}" --connect-timeout $TIMEOUT "$URL")
if [ "$HTTP_CODE" != "200" ]; then
MSG="网站异常告警\n域名:$URL\n状态码:$HTTP_CODE\n时间:$(date '+%Y-%m-%d %H:%M:%S')"
curl -s -H "Content-Type: application/json" -d "{\"msgtype\": \"text\", \"text\": {\"content\": \"$MSG\"}}" "$WEBHOOK"
fi
保存后赋予执行权限:
chmod +x /opt/scripts/check_site.sh
脚本只做一件事:如果状态码不是200,就发微信。
正常时不发消息,避免打扰。
设置定时任务
用 crontab -e 编辑当前用户的定时任务,加入一行:
*/5 * * * * /opt/scripts/check_site.sh > /dev/null 2>&1
这表示每5分钟执行一次。> /dev/null 2>&1 用来丢弃正常输出,防止日志堆积。
保存后可以用 crontab -l 查看是否生效。
避坑指南:这些细节容易翻车
权限问题:如果脚本用root用户跑,确保 /opt/scripts/ 目录和脚本文件对root可读可执行。
curl未安装:部分精简系统没有curl,先执行 which curl 确认,没有就用 apt install curl 或 yum install curl 安装。
微信收不到消息:检查Webhook地址是否完整,key有没有复制错。
可以在命令行手动执行一次脚本,把 if 条件临时改成 if [ "$HTTP_CODE" ! 来强制触发一次,确认机器人能收到消息。
= "200" ] || true
误报太多:如果网站偶尔响应慢但没挂,可以增加重试逻辑,比如连续两次检测失败才告警。
状态码判断太严格:有些网站返回301或302重定向,这是正常的。
可以把判断条件改成 if [ "$HTTP_CODE" -ge 400 ],只对4xx和5xx告警。
验证脚本是否正常工作
手动执行一次脚本:
/opt/scripts/check_site.sh
如果网站正常,终端不会有输出。
这时可以把脚本里的URL临时改成一个不存在的地址,再执行一次,微信应该立刻收到告警。
收到后改回真实地址。
最后确认定时任务在跑:等5分钟,查看微信是否收到消息(正常网站不会收到),或者用 tail -f /var/log/cron 观察任务执行记录。
常见疑问
检测多个网站怎么办?
可以把URL写成一个列表,用 for 循环遍历,每个网址单独判断。
能不能检测到网站内容变化?
可以,用 curl -s 获取页面内容,再和上次保存的内容做对比。但这会增加复杂度,建议先用连通性检测满足基本需求。
服务器本身断网了怎么办?
这个脚本无法处理服务器完全离线的情况,因为脚本本身也跑不了。如果需要这种级别的监控,建议用外部监控服务。
企业微信机器人有频率限制吗?
企业微信对机器人发消息有频率限制,建议实际使用中避免过于频繁的告警,比如设置告警后一段时间内不重复发送。
到这里,一个轻量的网站连通性监控就搭好了。
命令和路径都可以根据你的环境调整,关键是先跑通一次手动触发,确认微信能收到消息,再交给定时任务。