关于golang服务重启
我相信每个人都会想,每次更新完代码,更新完配置文件后,就直接这么 ctrl+c
真的没问题吗,ctrl+c
到底做了些什么事情呢?
本文我们讨论 ctrl+c
背后的信号以及如何优雅的重启服务,以及对 HTTP
服务进行热更新。
ctrl + c
在终端执行特定的组合键可以使系统发送特定的信号给此进程,完成一系列的动作
命令 | 信号 | 含义 |
---|---|---|
ctrl + c | SIGINT | 强制进程结束 |
ctrl + z | SIGTSTP | 任务中断,进程挂起 |
ctrl + \ | SIGQUIT | 进程结束 和 dump core |
ctrl + d | EOF | |
常用于重启、重新加载进程 | SIGHUP | 若程序中没有捕捉该信号,当收到该信号时,进程就会退出 |
SIGPIPE | 在进程往一个已经关闭的管道写数据时会产生 |
因此在我们执行ctrl + c
关闭服务端时,会强制进程结束,导致正在访问的用户等出现问题。
常见的 kill -9 pid
会发送 SIGKILL
信号给进程,也是类似的结果。
信号
本段中出现信号是什么呢?
信号是 Unix
、类 Unix
以及其他 POSIX
兼容的操作系统中进程间通讯的一种有限制的方式。
它是一种异步的通知机制,用来提醒进程一个事件(硬件异常、程序执行异常、外部发出信号)已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程。此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数。
所有信号
从go语言 go root SDK中 zerrors_linux_amd64.go
来看,关于信号有如下常量:
1 | SIGABRT |
怎样算优雅
优雅地退出
1 | // TrapSignal catches the SIGTERM/SIGINT/SIGKILL and executes cb function. |
在接收退出信号SIGTERM/SIGINT/SIGKILL
之后,系统退出os.Exit(0)
之前,执行cb() callback函数。具体执行方法建议如下:
1 | func Cmd(ctx *cli.Context) error { |
gin退出
1 | func main() { |