大家好,我是 frank。 欢迎大家点击上方蓝色文字「Golang 语言开发栈」关注公众号。 设为星标,第一时间接收推送文章。

01

介绍

kill -l

系统信号分为同步信号和异步信号。其中同步信号是程序执行中的错误触发的信号,在 Golang 程序中,同步信号通常会被转换为 runtime panic,异步信号是系统内核或其它程序发送的信号。

关于系统信号的更多内容,感兴趣的读者朋友可以自行检索相关资料学习。本文我们主要介绍怎么使用 Golang 语言拦截系统信号和怎么实现优雅退出 http server。

02

os/signal
os/signal
os/signal
os/signal

接收指定信号的示例代码:

接收所有信号的示例代码:

03

拦截系统信号并优雅退出 http server

os/signalhttp.Server

在 Golang 1.8 中新增的 Shutdown 方法可以在不中断任何活动连接的情况下正常关闭服务器。Shutdown 的工作方式是先关闭所有打开的监听器,然后关闭所有空闲连接,然后等待所有活跃连接为空闲状态时,关闭服务器。

如果提供的上下文在关闭完成之前已超时,则 Shutdown 返回上下文的错误,否则它将返回从关闭服务器的监听器返回的错误。

调用 Shutdown 时,Serve,ListenAndServe 和 ListenAndServeTLS 立即返回 ErrServerClosed。确保 Shutdown 未返回时,程序没有退出。

需要注意的是,Shutdown 不会尝试关闭也不等待长连接,例如 WebSockets。如果需要,Shutdown 的调用者应单独通知此类长连接,并等待它们关闭。

一旦调用了 Server 的 Shutdown 方法,server 就无法使用了。如果再调用 Serve 的方法将返回 ErrServerClosed。

优雅退出 http server 的示例代码如下:

阅读上面这段代码,可以发现我们拦截到系统信号 SIGNINT 后,通过 sleep 模拟程序还未执行结束(比如需要执行一些收尾工作),此时,系统未直接终止该应用进程(直接终止是系统默认处理信号 SIGINT 的方式),而是等待程序执行结束后,系统才终止该应用进程。

04

总结

os/signalnet/httphttp.ServerShutdown

参考资料: https://zh.wikipedia.org/wiki/Unix信号 https://golang.org/pkg/os/signal/#Notify https://golang.org/pkg/net/http/#Server.Shutdown