核心是用shell脚本+curl实现轻量http拨测:每10秒请求一次,校验状态码、响应时间及内容,支持重试、日志轮转、钉钉告警与简易指标采集。

用 Shell 脚本 + curl 对应用 Endpoint 做持续拨测,核心是:定时发起 HTTP 请求、判断响应状态、记录结果、异常时告警。不依赖复杂工具,轻量可控。
基础拨测脚本:检查状态码和响应时间
最简可用版本,每 10 秒请求一次,打印状态码、耗时和是否超时:
#!/bin/bash
URL="https://api.example.com/health"
while true; do
START=$(date +%s.%N)
CODE=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 --max-time 10 "$URL")
END=$(date +%s.%N)
TIME=$(echo "$END - $START" | bc -l | awk '{printf "%.3f", $1}')
<p>if [[ "$CODE" == "200" ]]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') OK $CODE ($TIME s)"
else
echo "$(date '+%Y-%m-%d %H:%M:%S') FAIL $CODE ($TIME s)"
fi
sleep 10
done
</p>说明:
• --connect-timeout 5:连接建立超时 5 秒
• --max-time 10:整个请求(含响应读取)最长 10 秒
• -w "%{http_code}" 只提取状态码,避免干扰输出
• 用 bc 和 awk 算出毫秒级响应时间
增强可靠性:加入响应体校验与重试机制
仅看 200 不够——可能返回错误 JSON 或空体。可检查关键字段或内容长度:
# 示例:要求响应包含 {"status":"up"} 且大小 > 10 字节
RESP=$(curl -s --connect-timeout 3 --max-time 8 "$URL")
CODE=$(echo "$RESP" | wc -c)
if [[ "$CODE" -gt 10 ]] && echo "$RESP" | grep -q '"status":"up"'; then
echo "✅ Healthy"
else
echo "❌ Unhealthy or timeout"
fi
建议加简单重试(最多 2 次)应对瞬时抖动:
- 失败后 sleep 2 秒再试一次
- 两次都失败才标记为异常
- 避免因网络偶发丢包误报
落地运行:后台守护 + 日志轮转 + 异常通知
生产环境需长期稳定运行,推荐以下实践:
- 用 nohup + & 或 systemd service 启动,防止终端关闭中断
- 输出重定向到日志文件,配合 logrotate 防止撑爆磁盘
- 异常时触发通知:可用 mail 发邮件,或调用企业微信/钉钉 Webhook(用 curl POST)
- 加锁机制(如 flock)防止脚本被重复启动
例如钉钉通知片段:
send_alert() {
curl -X POST -H 'Content-Type: application/json' \
-d "{\"msgtype\": \"text\", \"text\": {\"content\": \"⚠️ 拨测失败:$URL 返回 $CODE\"}}" \
https://oapi.dingtalk.com/robot/send?access_token=xxx
}
进阶建议:指标采集与简易可视化
若需长期观察趋势,可将每次结果写入 CSV 或推送到 Prometheus:
- 追加写入 timestamp,code,rt_ms,success 到 daily.csv
- 用 curl -s "$URL/metrics"(若应用暴露 Prometheus 格式指标)直接抓取
- 搭配 gnuplot 或本地 Python 脚本生成日报图表(非必须,但排查问题很直观)
无需上 ELK 或 Grafana,小团队靠文本日志 + grep + awk 就能快速定位故障时段。











