簡體   English   中英

為什么 kill -15 沒有優雅地殺死我的 Golang gRPC 服務?

[英]Why kill -15 does not gracefully kill my Golang gRPC service?

我使用信號處理程序來處理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() 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM