如何运用Golang ossignal库实现长尾词的平滑关机技巧?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1050个文字,预计阅读时间需要5分钟。
直接上核心:
常见错误是只监听 SIGINT(Ctrl+C),线上环境发的是 SIGTERM;还有人把 signal.Notify 放在 goroutine 里却忘了阻塞主流程,导致程序秒退。
-
signal.Notify第二个参数必须显式列出要监听的信号,os.Interrupt不等于syscall.SIGTERM - 推荐用
make(chan os.Signal, 1),缓冲区为 1 防止信号丢失(比如快速连发两次SIGTERM) - 收到信号后,应先关闭 listener(如
http.Server.Shutdown),再等待活跃请求完成,最后退出
http.Server.Shutdown 为什么总超时失败
不是函数有问题,而是你没给它足够时间,或者没提前停止接收新连接。
Shutdown 只负责“不再接受新请求 + 等待已有 handler 返回”,它不会强制杀掉卡住的 goroutine。如果你的 handler 里有没设 timeout 的 http.Client.Do、数据库查询或 channel receive,就会拖垮整个关机流程。
本文共计1050个文字,预计阅读时间需要5分钟。
直接上核心:
常见错误是只监听 SIGINT(Ctrl+C),线上环境发的是 SIGTERM;还有人把 signal.Notify 放在 goroutine 里却忘了阻塞主流程,导致程序秒退。
-
signal.Notify第二个参数必须显式列出要监听的信号,os.Interrupt不等于syscall.SIGTERM - 推荐用
make(chan os.Signal, 1),缓冲区为 1 防止信号丢失(比如快速连发两次SIGTERM) - 收到信号后,应先关闭 listener(如
http.Server.Shutdown),再等待活跃请求完成,最后退出
http.Server.Shutdown 为什么总超时失败
不是函数有问题,而是你没给它足够时间,或者没提前停止接收新连接。
Shutdown 只负责“不再接受新请求 + 等待已有 handler 返回”,它不会强制杀掉卡住的 goroutine。如果你的 handler 里有没设 timeout 的 http.Client.Do、数据库查询或 channel receive,就会拖垮整个关机流程。

