首页/开发/CI/CD 与发布速查/应用优雅退出(SIGTERM 处理)
发布策略60 条

应用优雅退出(SIGTERM 处理)

应用对 SIGTERM 的处理决定退出质量:停止接收新请求、处理完在途请求、释放资源后以正常状态退出;配合探针与 preStop 可降低发布期的 5xx。

CI/CD 与发布速查开发更新于 2026-10-13

优雅退出是什么

应用对 SIGTERM 的处理决定退出质量:停止接收新请求、处理完成在途请求、释放资源后以正常状态退出。发布与重启时旧实例先摘流再终止,配合探针与 preStop 钩子可以显著减少发布期的错误率尖峰;退出时限必须小于容器宽限期,否则会被强制终止,优雅逻辑形同虚设。

基本信息

信号容器主进程收到 SIGTERM
正确动作停收新连接、处理在途请求、释放资源后退出
兜底宽限期内未退出则被 SIGKILL 强制终止
语言侧多数框架需要显式注册信号处理
时限退出逻辑耗时小于宽限期

典型使用场景

  • 滚动发布:旧实例优雅退出,流量无损转移。
  • 缩容:控制器删除多余副本时的标准路径。
  • 手动重启:滚动重启同样触发同一套退出逻辑。
  • 消费端停机:先停止拉取新消息再处理完在途消息。
  • 连接清退:退出前注销服务发现与域名记录。

Python 示例

Python 示例
import signal, sys
def handle(signum, frame):
    server.shutdown()
    sys.exit(0)
signal.signal(signal.SIGTERM, handle)

退出阶段

阶段动作失败后果
摘流探针失败或端点移除新请求仍打到旧实例
终止信号停收新连接、处理在途在途请求失败
宽限期等待退出完成超时被强制终止
优雅退出时限要小于宽限期;停机与发布共用同一套退出逻辑,避免只在一个路径上验证。
顺序写进退出流程:停收新请求、等在途完成、销毁连接池与线程,步骤齐全才能干净退出。
preStop 钩子可做摘流缓冲:先让负载均衡感知下线,再发终止信号,减少竞态窗口。
长耗时任务要专门设计:批处理在收到信号后要么快速落盘检查点,要么调大宽限期。

易错点

  • 忽略 SIGTERM:进程直接被终止,在途请求全部失败。
  • 优雅退出耗时超过宽限期:SIGKILL 兜底,优雅逻辑形同虚设。
  • 先断依赖再退应用:退出过程中的资源访问失败,报错掩盖真实原因。
  • 队列消费者未停:重启后消息重复消费或丢失。
  • 连接池未销毁:退出卡在等待资源释放,拖满宽限期。
  • 只在生产验证退出:预发不测优雅退出,事故时才发现行为异常。
  • 信号处理器里做重活:阻塞主线程导致退出卡死,处理要轻量。

数据来源与参考

  • Kubernetes 文档《Termination of Pods》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌