本文目录导读:

- 方法一:使用 Shell 脚本(Linux/Mac,依赖 curl)
- 方法二:使用 Python 脚本(跨平台,更灵活)
- 方法三:使用 Node.js 脚本(适合前端开发者)
- 高级用法:持续监控与警报(结合 cron 或定时任务)
- 关键注意事项
- 推荐方案
要用脚本监控网站响应时间,最常用的方式是通过HTTP请求来测量从发送请求到收到完整响应所花费的时间,以下是几种常见的脚本方法,从简单到复杂,供你参考。
使用 Shell 脚本(Linux/Mac,依赖 curl)
这是最简单、最快速的方法。curl 命令提供了 -o /dev/null -s -w 选项来输出详细的时间信息。
(monitor_curl.sh):**
#!/bin/bash
# 要监控的网站
TARGET_URL="https://www.example.com"
# 使用 curl 进行请求,-o 忽略下载内容,-s 静默模式,-w 输出自定义格式
# connect_time: 连接时间 (TCP 握手完成)
# starttransfer_time: 开始传输首字节的时间 (TTFB)
# total_time: 总请求时间(从开始到完成)
result=$(curl -o /dev/null -s -w "connect_time:%{time_connect}\ntime_starttransfer:%{time_starttransfer}\ntotal_time:%{time_total}\nhttp_code:%{http_code}" "$TARGET_URL")
# 解析结果
echo "--- 网站响应时间报告 ---"
echo "URL: $TARGET_URL"
echo "$result"
echo "-------------------------"
# 可选:判断总时间是否超过阈值(2 秒)
total=$(echo "$result" | grep "total_time" | cut -d: -f2)
if (( $(echo "$total > 2.0" | bc -l) )); then
echo "警告:响应时间超过 2 秒!"
fi
使用方法:
chmod +x monitor_curl.sh- 设置
TARGET_URL为你的目标网站。 - 运行
./monitor_curl.sh
输出示例:
--- 网站响应时间报告 ---
URL: https://www.example.com
connect_time:0.123
time_starttransfer:0.456
total_time:0.789
http_code:200
-------------------------
时间指标说明:
- connect_time:建立 TCP 连接所用的时间(秒)。
- time_starttransfer:从请求开始到服务器开始发送第一个字节的时间(TTFB,秒),代表服务器处理延迟。
- total_time:整个请求完成的时间(秒),是用户感知的关键指标。
- http_code:HTTP 状态码,200 表示正常。
使用 Python 脚本(跨平台,更灵活)
Python 的 requests 库内置了请求耗时属性,非常适合监控,如果需要更高级的指标(如 DNS 解析时间、SSL 握手时间),可以使用 pycurl。
(monitor_py.py):**
import requests
import time
from datetime import datetime
def monitor_website(url, timeout=10):
"""
监控指定网站的响应时间
返回: 字典包含各种时间指标
"""
start_time = time.time()
try:
response = requests.get(url, timeout=timeout)
elapsed = response.elapsed.total_seconds()
end_time = time.time()
# 计算网络层面的往返时间(RTT)
rtt = end_time - start_time
report = {
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"url": url,
"status_code": response.status_code,
"response_time_elapsed": round(elapsed, 3), # 从发送请求到收到响应头部
"rtt_approx": round(rtt, 3), # 近似总耗时(包括 DNS 解析等)
"success": response.ok
}
return report
except requests.exceptions.Timeout:
return {"url": url, "error": "请求超时", "success": False}
except requests.exceptions.RequestException as e:
return {"url": url, "error": str(e), "success": False}
def main():
target = "https://www.example.com"
result = monitor_website(target)
print("--- 网站响应时间报告 ---")
for key, value in result.items():
print(f"{key}: {value}")
# 判断是否异常(阈值 3 秒)
if result.get("success") and result.get("response_time_elapsed", 0) > 3:
print("⚠️ 警告:响应时间超过 3 秒!")
elif not result.get("success"):
print("❌ 错误:网站无法正常访问!")
if __name__ == "__main__":
main()
运行方式:
python3 monitor_py.py
优点: 容易扩展,可以加入数据记录(写入 CSV)、发送警报(邮件、钉钉)等功能。
使用 Node.js 脚本(适合前端开发者)
(monitor_node.js):**
const http = require('http');
const https = require('https');
function monitorWebsite(url, callback) {
const startTime = process.hrtime();
const module = url.startsWith('https') ? https : http;
const request = module.get(url, (response) => {
const hrTime = process.hrtime(startTime);
const timeInMs = (hrTime[0] * 1000) + (hrTime[1] / 1000000); // 转换为毫秒
let data = '';
response.on('data', (chunk) => { data += chunk; });
response.on('end', () => {
callback(null, {
url: url,
statusCode: response.statusCode,
responseTimeMs: timeInMs,
timestamp: new Date().toISOString()
});
});
});
request.on('error', (err) => {
callback(err, null);
});
request.setTimeout(10000, () => {
request.destroy();
callback(new Error('请求超时'), null);
});
}
// 使用示例
const targetUrl = 'http://www.example.com';
monitorWebsite(targetUrl, (err, result) => {
if (err) {
console.error('监控失败:', err.message);
return;
}
console.log('--- 网站响应时间报告 ---');
for (const [key, value] of Object.entries(result)) {
console.log(`${key}: ${value}`);
}
if (result.responseTimeMs > 2000) {
console.log('⚠️ 警告:响应时间超过 2 秒!');
}
});
运行方式:
node monitor_node.js
高级用法:持续监控与警报(结合 cron 或定时任务)
-
使用 Linux 定时任务(cron)每一分钟运行监控脚本:
crontab -e # 添加这一行(每一分钟执行一次,将日志追加到 monitor.log) * * * * * /path/to/monitor_curl.sh >> /var/log/website_monitor.log 2>&1
-
使用 Python 脚本记录历史数据并分析: 可以将每次监控结果写入 CSV 文件,然后用 Excel 或 Grafana 可视化趋势。
关键注意事项
- 网络波动:单次请求不能代表网站真实状态,建议多次取平均(如每分钟一次)。
- 区分指标:
- 响应时间(TTFB):反映服务器处理能力。
- 总时间:反映用户端体验,受网络带宽和距离影响大。
- 添加重试机制:避免因临时网络抖动导致误报警。
- 资源消耗:频繁请求可能会被服务器视为攻击,很多站点(如阿里云、AWS)有速率限制,建议请求间隔 ≥ 30 秒。
推荐方案
- 最简单:Shell +
curl,适合 Linux 运维。 - 最灵活:Python +
requests,适合需要记录数据分析趋势的场景。 - 最专业:使用现有的监控工具如 Prometheus + Blackbox Exporter 或 Nagios,它们专为这种任务设计,性能更好、配置更丰富。
你倾向于哪种环境?我可以帮你调整脚本或补充更多细节。