为什么kill-15不能优雅地终止我的Golang gRPC服务?
我使用了信号处理程序来处理SIGTERM,SIGINT信号。当grpc服务器启动并运行时,我发出sudo kill-15[PID]命令,我看不到正常的关机日志报告,并且我得到:为什么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
[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。