【问题标题】:Why kill -15 does not gracefully kill my Golang gRPC service?为什么 kill -15 没有优雅地杀死我的 Golang gRPC 服务?
【发布时间】:2021-03-30 12:17:24
【问题描述】:

我使用信号处理程序来处理SIGTERMSIGINT 信号。当 grpc 服务器启动并运行时,我发出 sudo kill -15 [PID] 命令,但我没有看到正常的关闭日志报告,而且我得到:

[1]    41983 terminated  go run mypkg/main.go

现在,当我使用 netstat 时,它报告端口号 50051 已打开,由于端口号繁忙,我无法运行我的服务器。

我做了什么:

func main() {
    flag.Parse()
    fmt.Printf("Starting up server on 0.0.0.0:%v...\n", *port)
    server := NewServer(fmt.Sprintf("0.0.0.0:%d", *port))
    wg := sync.WaitGroup{}
    wg.Add(1)
    go func() {
        server.Run()
        wg.Done()
    }()
    // Signal handling and graceful shutdown of gRPC server
    signalChan := make(chan os.Signal, 1)
    signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)
    <-signalChan
    server.Stop()
    wg.Wait()
}

server.Stop()函数用于停止grpc服务器grpcServer.GracefulStop(),并记录一些数据。 当我发出CTRL+C 时,一切都按预期工作。为什么sudo kill -15我有这种行为?

【问题讨论】:

  • NewServer 是您自己的代码还是第三方包?以上应该工作。使用这个simplified version 可以在Linux 上使用kill -15。如果NewServer 不是您的代码 - 也许它有自己的信号处理程序?
  • 不要使用go run。这种方式的信号转发可能不可靠。改用go buildgo install,或者至少不要kill -15 go 进程,而是已经构建的二进制文件(可能在/tmp 中)。
  • 我知道我们一天要说 100 次,但不要使用 go run(至少如果你不明白它在做什么)。当您从终端 ctrl+c 时,它会向整个进程组发送信号,而 kill 没有这样做。

标签: go grpc signal-handling graceful-shutdown


【解决方案1】:

由于未来的读者可能也有我的问题,我尝试根据用户 cmets 回答我自己的问题。

彼得:

不要使用 go run。这种方式的信号转发可能不可靠。改用 go build 或 go install ,或者至少不要杀死 -15 的 go 进程,而是已经构建的二进制文件(可能在 /tmp 中)。

吉姆布:

我知道我们每天要说 100 次,但不要使用 go run(至少如果你不明白它在做什么)。当您从终端按 ctrl+c 时,它会向整个进程组发送信号,而您没有使用 kill。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 2019-07-19
    • 2013-05-04
    相关资源
    最近更新 更多