标准答案
- SIGTERM 通常表示请求进程结束,程序可以停止接收新请求、完成有限期限内的工作并释放资源。
- SIGKILL 由内核强制终止,适合进程失控或优雅退出已经超时的情况,但不会执行应用清理逻辑。
- SIGHUP、SIGINT、SIGQUIT 等信号的约定不同,不能只按信号名称推断业务语义。
- 优雅停机要配合超时、子进程回收、连接关闭和幂等恢复;发送 SIGTERM 后应观察进程是否真正退出。
题目解析
SIGTERM 是请求进程自行清理后退出的协作信号,应用可以捕获并设置停止标志;SIGKILL 由内核立即终止,应用无法捕获、阻塞或清理。信号的到达只表示控制面发出了停止请求,不代表连接、子任务或消息已经完成。
信号处理器应尽量只写入标志或通知主循环,复杂逻辑放到正常的事件循环中执行。停机流程还要先摘除流量、停止拉取新任务、等待在途工作并设置截止时间,超过截止时间才考虑强制终止,同时接受未完成工作可能需要重试或恢复。
常见误区
- 误区:一遇到停机就发送 SIGKILL。改正:先用 SIGTERM 给应用清理机会,超过明确 deadline 再强制终止。
- 误区:在信号处理器里做复杂 I/O 或加锁。改正:只通知主循环,把清理放到可控的正常执行路径。
- 误区:收到 SIGTERM 就当作请求已经完成。改正:单独统计在途请求、消费者和子进程的排空状态。