必须用 requests.get() 发真实 HTTP 请求并检查状态码(200–399 为在线,5xx 报警),设 timeout、禁重定向;邮件需按服务商配 SMTP,捕获异常;循环检测要异常隔离与降频重试;告警去重;用 systemd 等进程管理器守护。

用 requests.get() 检测网站是否可访问,别用 socket.connect() 简单连通测试
只检查 TCP 连通(比如用 socket 连 80/443 端口)会误报:网站进程挂了但 Nginx 还在监听,或者反向代理返回 502 却没触发告警。必须发真实 HTTP 请求并检查响应状态码。
关键点:
-
requests.get(url, timeout=10)要设timeout,否则 DNS 卡住或后端死循环会导致脚本阻塞 - 只认
response.status_code在 200–399 范围为“在线”,4xx(如 404)算正常服务中,5xx(如 500、502、503)必须报警 - 加
allow_redirects=False避免被跳转干扰判断——比如监控https://example.com,结果被重定向到维护页,状态码变成 302 就漏判了
用 smtplib 发邮件时,SMTP 服务器和认证方式要匹配服务商要求
Gmail、Outlook、阿里云邮箱的 SMTP 配置差异很大,填错一个参数就静默失败。不是所有邮箱都支持密码直连,多数需要应用专用密码或开启 SMTP 权限。
常见配置示例:
立即学习“Python免费学习笔记(深入)”;
- Gmail:
smtp.gmail.com:587,启用 TLS,用户名是完整邮箱地址,密码必须是 App Password(不是登录密码) - 阿里云企业邮箱:
smtp.mxhichina.com:465,必须用 SSL,用户名是邮箱全名,密码是邮箱登录密码(需在控制台开启 SMTP 服务) - 本地 Postfix 或自建 MailHog:用
localhost:1025,无需认证,适合开发调试
务必捕获 smtplib.SMTPAuthenticationError 和 smtplib.SMTPRecipientsRefused,否则发信失败你根本不知道。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
写成循环检测时,用 time.sleep() 控制频率,但别忽略异常中断后的重试逻辑
简单 while True + sleep 容易出问题:网络临时抖动导致一次请求异常,如果没处理好,可能整个循环退出,监控就断了。
建议结构:
- 外层用
while True:保证长期运行 - 内层用
try...except requests.RequestException:捕获所有网络相关异常(超时、DNS 失败、连接拒绝等),记录日志但不退出 - 成功检测后才 sleep;失败时 sleep 时间可略缩短(比如 30 秒),避免反复狂刷失败请求
- 每次发送报警邮件前,加个
if not last_alerted or (now - last_alerted) > 300去重——5 分钟内只报一次,防止邮件刷屏
生产环境别裸跑脚本,用 systemd 或 supervisord 管理进程
直接 python monitor.py & 启动,机器重启或 OOM kill 后就没了。必须交由进程管理器保障存活。
以 systemd 为例(/etc/systemd/system/website-monitor.service):
[Unit] Description=Website Uptime Monitor After=network.target <p>[Service] Type=simple User=monitor WorkingDirectory=/opt/monitor ExecStart=/usr/bin/python3 /opt/monitor/check.py Restart=always RestartSec=10 StandardOutput=journal StandardError=journal</p><p>[Install] WantedBy=multi-user.target
注意:Restart=always 是必须的;RestartSec=10 避免频繁崩溃重启;日志走 journal 方便用 journalctl -u website-monitor 查。
真正难的不是发一次邮件,而是让这个检测逻辑在没人看管的情况下,连续跑几个月不出偏差——超时设置、错误隔离、告警去重、进程守护,每一环断掉都会让“报警”变成“幻觉”。

















