为什么kill-15不能优雅地终止我的Golang gRPC服务?

为什么kill-15不能优雅地终止我的Golang gRPC服务?,go,grpc,signal-handling,graceful-shutdown,Go,Grpc,Signal Handling,Graceful Shutdown,我使用了信号处理程序来处理SIGTERM,SIGINT信号。当grpc服务器启动并运行时,我发出sudo kill-15[PID]命令,我看不到正常的关机日志报告,并且我得到: [1] 41983 terminated go run mypkg/main.go 现在,当我使用netstat时,它会报告端口号50051已打开,我无法运行服务器,因为端口号正忙 我所做的: func main() { flag.Parse() fmt.Printf("Startin

我使用了信号处理程序来处理SIGTERM,SIGINT信号。当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上我会有这种行为?

因为未来的读者可能也会有我的问题,我试图根据用户的评论回答我自己的问题

彼得:

不要使用go run。这样,信号转发可能不可靠。改用go build或go install,或者至少不要终止go进程,但是已经构建的二进制文件可能在/tmp中

吉米:


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


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