优雅地退出 go 应用程序

Eve*_*ert 7 go

我是 Go 的新手,我有一些小服务正在运行。

当我部署一个新版本时,我通常只上传新的二进制文件、kill现有的进程并开始一个新的进程。

我想知道这是否是正确的做法,或者是否有更好的方法来做到这一点。

cod*_*eak 8

杀死进程,替换和重新启动没有任何问题。如果您想在退出时进行一些清理,您可以执行以下操作:

import(
   "fmt"
   "os"
   "os/signal"
   "syscall"
)

func main(){
   //work here

   go gracefulShutdown()
   forever := make(chan int)
   <-forever
}

func gracefulShutdown() {
    s := make(chan os.Signal, 1)
    signal.Notify(s, os.Interrupt)
    signal.Notify(s, syscall.SIGTERM)
    go func() {
        <-s
        fmt.Println("Sutting down gracefully.")
        // clean up here
        os.Exit(0)
    }()
}
Run Code Online (Sandbox Code Playgroud)

如果你确实 kill {pid} (没有 -9 开关),进程将gracefullShutdown在终止前调用函数。

  • 不无限期阻塞 `main()` 的更好方法:https://play.golang.org/p/X-6_qY810j。无论如何,当它要点亮另一个 goroutine 时,没有理由在 goroutine 中触发 `gracefulShutdown()`,这让 **main** 成为实际结束程序的那个(这是应该发生的事情)。此外,在您的版本中,永远实际上不必通过 `make` 运行,因为 nil 通道会无限期地阻塞。因此,`var never chan int` 避免了分配并以相同的方式工作。 (3认同)