golang 处理系统 Signal 实现程序优雅退出

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

你可能感兴趣的:(golang 处理系统 Signal 实现程序优雅退出)