[英]Why kill -15 does not gracefully kill my Golang gRPC service?
我使用信號處理程序來處理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()
function 用於停止 grpc 服務器grpcServer.GracefulStop()
,並記錄一些數據。 當我發出CTRL+C
時,一切都按預期工作。 為什么sudo kill -15
我有這種行為?
由於未來的讀者可能也會遇到我的問題,因此我嘗試根據用戶評論回答我自己的問題。
彼得:
不要使用 go 運行。 這種方式的信號轉發可能不可靠。 使用 go build 或 go install 代替,或者至少不要殺死 -15 go 進程,但二進制文件已在/tmp.
吉姆B:
我知道我們每天要說 100 次,但不要使用 go 運行(至少如果你不明白它在做什么)。 當您從終端按 ctrl+c 時,它會向整個進程組發送信號,而您沒有使用 kill。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.