Master通过非阻塞waitpid轮询子进程状态,发现非0退出码即判定Worker异常并拉起新进程;1秒内异常≥10次则主动退出防雪崩,Master自身崩溃等场景不触发恢复。

Master 进程本身不直接响应异常信号,它只接收并处理预设的控制信号(如 HUP、QUIT、USR1 等),而对 Worker 异常退出的感知,靠的是内核通知机制——SIGCHLD,不是“异常信号”本身被发送给 Master,而是 Worker 崩溃后系统自动发 SIGCHLD 给其父进程(即 Master)。
Master 如何发现 Worker 异常退出
Master 不依赖 Worker 主动上报,而是通过轮询方式主动检查子进程状态:
- 在自己的事件循环中定期调用 waitpid(),配合
WNOHANG标志非阻塞查询 - 若返回 PID > 0 且退出状态码非 0(如段错误返回 139、被 OOM killer 杀掉返回 -1),就判定为异常退出
- 正常 reload 或 quit 时 Worker 会 clean exit 并返回 0,Master 识别后不拉起新进程
异常后的自动恢复动作
确认异常后,Master 立即执行恢复流程:
- fork + exec 启动一个新 Worker,复用已创建的监听 socket 和共享内存等资源
- 新 Worker 继承完整配置副本(通过写时复制 COW),无需重新解析或 bind/listen
- 若 1 秒内发生 ≥10 次异常退出,Master 主动退出并记录日志,防止雪崩
哪些情况不会触发自动恢复
该机制仅覆盖 Worker 进程级故障,以下情形需人工介入:
- Master 自身崩溃(如配置语法错误导致启动失败、加载不兼容模块 segfault)
- 系统资源耗尽(端口被占、内存不足、文件描述符超限)
- 手动 kill -9 Master 或强制终止其父进程(如 systemd stop)
本质上,Master 对“异常”的响应不是靠接收某个特殊信号,而是靠稳定、可控的子进程状态监控和受限条件下的自动重建。它不追求万能兜底,而是在简洁与可靠之间做了明确取舍。


















