go 通过处理系统的 Signal 可以实现程序的优雅退出,go signal 包中的 Notify 函数定义如下:
func Notify(c chan<- os.Signal, sig …os.Signal)
该函数会将进程收到的系统 Signal 转发给 channel c,转发哪些信号由该函数的可变参数决定。
- 如果你没有传入 sig 参数,那么 Notify 会将系统收到的所有信号转发给c。
- 如果传入了 sig 参数,则 go 只会关注你传入的 Signal 类型,其他的 Signal 会按照默认方式处理。
因此你可以在 Notify 函数中传入你要关注和处理的 Signal 类型,通过自定义函数来改变信号对应的行为。
简单示例代码如下:
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
)
func main() {
signalChan := make(chan os.Signal, 1)
signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)
<-signalChan
/* 可以在下面定义一些资源回收,代码清理工作 */
fmt.Println("exit...")
}
上述代码监听了如下信号:
- SIGINT: Ctrl-C 发送 INT signal (SIGINT),通常导致进程结束
- SIGTERM: 程序结束(terminate)信号
- 有两种信号不能被拦截和处理: SIGKILL 和 SIGSTOP
网友评论