用 systemd 或 supervisord 看护进程比 python 自写重启逻辑更可靠;健康检查需发真实请求验证响应,而非仅测端口;异常时勿盲目重启,仅 importerror、memoryerror 等破坏性错误才需重启;gunicorn 等多进程服务应依赖其内置机制而非额外守护。

Python 进程崩溃后怎么自动拉起来
靠 systemd 或 supervisord 做进程看护,比在 Python 里自己写“重启逻辑”更可靠。自己用 while True 包一层主函数,看似简单,实则掩盖信号处理、子进程残留、资源泄漏等问题。
常见错误现象:KeyboardInterrupt 捕获后没退出循环,导致 Ctrl+C 失效;os.execv 替换进程失败却继续循环,产生僵尸进程;日志里反复出现 Process finished with exit code 1 却无上下文。
- 用
systemd:写一个.service文件,设置Restart=on-failure和RestartSec=3,比任何 Python 脚本都稳 - 避免在代码里调用
os.fork()或subprocess.Popen(..., shell=True)后自行 wait —— 容易漏掉 SIGCHLD 处理 - 如果必须自启(如容器内无 init 系统),用
os.execv(sys.executable, [sys.executable] + sys.argv)替换当前进程,而不是os.system("python ...")
如何判断服务真的“挂了”而不是暂时忙
HTTP 服务健康检查不能只看端口是否通,得发真实请求并验证响应体。很多自愈脚本用 socket.connect_ex() 判断端口,结果服务卡在 GC 或死锁中,端口还开着,但接口已不返回数据。
使用场景:Docker 容器健康检查、K8s livenessProbe、或本地监控脚本。
立即学习“Python免费学习笔记(深入)”;
专为中小型企业定制的网络办公软件,富有竞争力的十大特性: 1、独创 web服务器、数据库和应用程序全部自动傻瓜安装,建立企业信息中枢 只需3分钟。 2、客户机无需安装专用软件,使用浏览器即可实现全球办公。 3、集成Internet邮件管理组件,提供web方式的远程邮件服务。 4、集成语音会议组件,节省长途话费开支。 5、集成手机短信组件,重要信息可直接发送到员工手机。 6、集成网络硬
- 对 Web 服务,用
requests.get("http://localhost:8000/health", timeout=2),检查状态码和 JSON 中的"status"字段是否为"ok" - 避免在健康检查路径里做 DB 查询或外部调用 —— 它应该轻量、无副作用、不依赖其他服务
- 超时必须设(建议 ≤3s),否则自愈脚本会卡住,误判为“假死”
Python 里捕获异常后要不要重启整个进程
绝大多数情况下——不要。一次 ValueError 或 KeyError 不代表服务不可用,盲目重启反而放大抖动。真正需要重启的,是那些破坏进程全局状态的错误:比如 ImportError(模块加载失败)、MemoryError(堆内存耗尽)、或 RuntimeError 提示 "dictionary changed size during iteration" 这类底层不一致。
性能影响:每次重启都要重载所有模块、重建连接池、初始化缓存,开销远大于单次请求失败。
- 业务异常(如用户传错参数)应被
try/except拦住,返回 400,不触发自愈 - 若用
atexit.register()清理资源,确保它不会因异常未执行而堆积句柄 - 记录
sys.exc_info()时别直接打traceback.print_exc()到 stdout —— 容器日志可能被截断,优先写文件或发到日志服务
多进程服务(如 Gunicorn)的自愈边界在哪
Gunicorn 自己就有 --preload、--max-requests、--timeout 这些机制,你再套一层“主进程监控 worker”,大概率画蛇添足。Gunicorn 的 master 进程天然负责拉起挂掉的 worker,你额外加的守护脚本反而可能干扰它的信号传递逻辑。
容易踩的坑:ps aux | grep gunicorn 找进程然后 kill -9 再启动,结果干掉了 master,只剩孤立 worker;或者用 os.killpg() 杀进程组,把日志收集进程也一并干掉。
- 优先调
gunicorn --preload --max-requests=1000 --timeout=30,让 worker 定期轮换,比等它崩了再救更稳妥 - 真要干预,用
gunicorn --reload或发送SIGHUP给 master PID,而不是重启整个服务 - 监控指标看
gunicorn.workers数量波动 +gunicorn.requests5xx 率,比单纯数进程数有用得多
自愈不是“出问题就重启”,而是清楚知道哪类问题该重启、哪类该降级、哪类该告警。最危险的,是把“能自动恢复”当成“可以不深挖根因”的借口。









