服务公告

服务公告 > 技术教程 > Linux 优雅退出:信号处理与清理动作

Linux 优雅退出:信号处理与清理动作

发布时间:2026-01-12 09:58
## 概念 进程退出不是简单消失,而是一场可以安排的告别。内核通过信号通知进程外部事件,进程收到后自行决定如何收尾:把缓冲写入磁盘、关闭网络连接、通知下游、释放锁。处理得当的退出叫优雅退出,数据与状态保持一致;处理不当的退出留下半截文件与悬挂连接,重启后要花几倍时间收拾。理解信号的层次,是让服务经得起重启与发布的前提。 ## 原理:两类关键信号 SIGTERM 是礼貌的请求:请你自己收尾后退出,进程有机会执行清理逻辑,系统关机与服务停止默认先发它。SIGKILL 是不可抗拒的强制:内核直接回收进程,清理代码没有机会运行,缓冲数据随之丢失。规范的服务应当监听前者的到来并快速完成清理,强杀永远是最后手段。此外还有一批功能性信号:重载配置、重开日志文件、上报状态,都走同一套机制,把信号当成进程的控制接口,比一堆管理脚本更轻。 ## 最小实操 给进程发礼貌的停止请求。 ``` kill -TERM 2517 ``` 等几秒确认退出后再考虑强杀。 ``` kill -KILL 2517 ``` 服务由 systemd 管理时,stop 动作内部就是先请求后强杀的顺序,超时参数控制它的耐心程度,给业务足够的清理时间即可。自己写的长任务,在代码里注册 TERM 的处理函数,把临时文件清理与进度落盘放进去。 ## 常见错误 一是遇到卡进程直接强杀,正在写的数据文件被拦腰截断,损坏要在很久之后才暴露;二是清理动作里又做了重活,退出耗时超过管理器的耐心,最终仍被强杀,等于没做;三是发布脚本不区分信号,一刀切杀进程组,把无辜的邻居也带走。顺云云服务器上做发布与重启操作,先请求优雅退出并观察日志确认收尾完成,这个顺序花不了十秒,却能让数据完整性少冒一次险。