程序热重启 #
程序如何优雅退出? #
Linux 信号 #
信号是进程间通信的底层形式。
Linux 有标准信号 32 个,从 32-63 的信号是实时信号。
发送信号的原因:
-
硬件异常:如 0 作为除数,内核会发送 SIGFPE(信号值 8)
-
软件异常:如进程终止时,内核会给父进程发送 SIGCHLE(信号值 17),窗口大小调整,应用程序会收到 SIGWINCH(信号值 28)
-
SIGINT
2ctrl + C
-
SIGQUIT
3ctrl + \
-
SIGKILL
9- 不可以被阻塞、处理和忽略
-
SIGTERM
15kill
默认不带参数,发送的信号就是SIGTERM
- 可以被阻塞、处理和忽略
-
SIGTOP
20- 停止(挂起)进程
ctrl + D
- 停止(挂起)进程
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
fmt.Println("awaiting signal")
<-sigs
fmt.Println("exiting")
如何实现热重启的? #
- 服务端启动时多开启一个协程用来监听关闭信号
- 当协程接收到关闭信号时,将拒绝接收新的连接,并处理好当前所有连接后断开
- 启动一个新的服务端进程来接管新的连接
- 关闭当前进程
叶王 © 2013-2024 版权所有。如果本文档对你有所帮助,可以请作者喝饮料。