接口健康检查需满足http 200且响应体含{"status": "ok"},用requests.get(timeout=(3,7))并捕获requestexception,结合systemctl状态校验与分级告警,由系统守护进程而非脚本拉起服务。

用 requests.get() 做接口健康检查,别用 urllib 手动拼接
核心判断逻辑就一条:能拿到 HTTP 200 且响应体里有预期标识(比如 {"status": "ok"}),才算接口活着。用 requests 是因为自带连接超时、重试控制和 JSON 解析,urllib 容易漏掉 timeout 导致脚本卡死。
常见错误是只检查状态码,忽略业务层返回内容。比如 Nginx 返回 200 但后端进程已崩,实际返回的是 “502 Bad Gateway” HTML 页面——得加一层 response.json().get("status") == "ok" 校验。
- 必须设
timeout=(3, 7):第一个数字是连接超时,第二个是读取超时,避免单次检测拖垮整个轮询周期 - 不要用
try/except Exception捕获所有异常,只捕获requests.exceptions.RequestException,否则KeyboardInterrupt也会被吞掉 - 如果接口需要认证,把
headers={"Authorization": "Bearer xxx"}写进requests.get(),别在 URL 里拼 token
服务重启不能直接 os.system("systemctl restart xxx")
Linux 下用 systemctl 是对的,但直接调 os.system() 会丢失错误码,失败了你也看不见。更糟的是,如果目标服务没用 systemd 管理(比如用 supervisord 或裸跑 Python 进程),这行命令就完全失效。
真正健壮的做法是先查服务状态,再决定是否重启:
- 用
subprocess.run(["systemctl", "is-active", "--quiet", "my-api"], capture_output=True)判断是否 running,返回码为 0 才算活 - 重启前加
subprocess.run(["systemctl", "is-enabled", "my-api"], capture_output=True),防止服务被手动 disable 后反复无效重启 - 如果服务不是 systemd 管理,改用
ps aux | grep my_api.py+kill -9+nohup python my_api.py &组合,但务必记录 PID 到文件,避免重复拉起
轮询间隔和告警要分开处理,别混在同一个循环里
每 10 秒查一次接口?那太频繁,可能被限流;每 5 分钟查一次?宕机 4 分 59 秒才发现,也不行。建议初始间隔设 30 秒,连续失败 3 次再触发重启,同时发告警。
关键点在于:重启和服务恢复是两件事。重启成功 ≠ 接口立刻可用(比如 Django 服务要等 migrations 加载)。所以重启后必须等待至少 10 秒,再做一次健康检查确认。
- 用
time.sleep(30)做轮询间隔,别用threading.Timer——多定时器容易状态混乱 - 告警建议走企业微信或钉钉 Webhook,而不是邮件:邮件延迟高,且 Python 发信依赖 SMTP 配置,容易因密码过期失效
- 每次检测结果写入本地日志文件(如
/var/log/api-health.log),用logging.basicConfig(filename=...),别只 print 到终端——服务后台运行时看不到 stdout
supervisord 或 systemd 本身就能做进程守护,脚本只负责“发现+通知”
很多人写完检测脚本,又自己实现“自动拉起进程”,其实绕过了系统级守护机制。正确分工是:systemd 负责崩溃后立即拉起主进程,你的脚本只负责发现“进程活着但接口不响应”这种软故障。
比如 systemd 的 RestartSec=5 和 Restart=on-failure 已经能处理进程闪退,但无法感知 Flask 应用卡死在某个死循环里。这时你的脚本才该出手。
- 检查前先确认
systemctl show --property=SubState my-api | grep -q "running",排除“进程起来了但没监听端口”的情况 - 如果用
supervisord,对应换成supervisorctl status my-api | grep -q "RUNNING" - 脚本本身也要被守护:用
systemctl管理这个检测脚本,设置Restart=always,否则检测脚本自己挂了就彻底失联
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











