Golang如何实现系统信号处理和网络监听下的平滑重启实战技巧?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1063个文字,预计阅读时间需要5分钟。
因未屏蔽信号传播、未等旧连接关闭、也未阻塞主+
- 必须用
signal.Ignore(syscall.SIGUSR2)防止子进程(比如 exec.Command 启动的新实例)也收到同个信号,否则新老进程互相干扰 -
signal.Notify的 channel 要在http.Server.Shutdown调用前就准备好,否则信号来了却没人收 - 主 goroutine 不能退出:常见错误是监听完信号就 return,导致 main 函数结束,整个进程终止;得用
select {}或sync.WaitGroup卡住 - Linux 下
SIGUSR2是常用重启信号,但 macOS 不支持该信号用于用户进程(会报operation not permitted),开发时建议改用SIGHUP或SIGTERM
http.Server.Shutdown 超时设成 5 秒够不够?
不够,取决于你后端依赖和客户端行为。硬设 5 秒大概率会强制断开长轮询、WebSocket 或正在上传的请求。
本文共计1063个文字,预计阅读时间需要5分钟。
因未屏蔽信号传播、未等旧连接关闭、也未阻塞主+
- 必须用
signal.Ignore(syscall.SIGUSR2)防止子进程(比如 exec.Command 启动的新实例)也收到同个信号,否则新老进程互相干扰 -
signal.Notify的 channel 要在http.Server.Shutdown调用前就准备好,否则信号来了却没人收 - 主 goroutine 不能退出:常见错误是监听完信号就 return,导致 main 函数结束,整个进程终止;得用
select {}或sync.WaitGroup卡住 - Linux 下
SIGUSR2是常用重启信号,但 macOS 不支持该信号用于用户进程(会报operation not permitted),开发时建议改用SIGHUP或SIGTERM
http.Server.Shutdown 超时设成 5 秒够不够?
不够,取决于你后端依赖和客户端行为。硬设 5 秒大概率会强制断开长轮询、WebSocket 或正在上传的请求。

