Голанг поймать сигтерму и продолжить применение - PullRequest
0 голосов
/ 24 июня 2019

Можно ли поймать sigterm в Голанге и двигаться дальше по коду, как паника / отсрочка?

Пример:

func main() {
    fmt.Println("app started")
    setupGracefulShutdown()

    for {
    }
    close()    
}

func close() {
    fmt.Println("infinite loop stopped and got here")
}

func setupGracefulShutdown() {
    sigChan := make(chan os.Signal)
    signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)

    go func() {
        fmt.Println(" got interrupt signal: ", <-sigChan)
    }()
}

// "app started"
// CTRL + C
// ^C "got interrupt signal:  interrupt"
// app don't stop

Что я хочу, это напечататьinfinite loop stopped and got here и закончить применение.

// "app started"
// CTRL + C
// ^C "got interrupt signal:  interrupt"
// "infinite loop stopped and got here"

1 Ответ

1 голос
/ 24 июня 2019

Этого очень легко достичь.Поскольку канал сигнала должен блокироваться и ждать сигнала, вы должны запустить свой код бизнес-логики в другом порядке.

func main() {
    cancelChan := make(chan os.Signal, 1)
    // catch SIGETRM or SIGINTERRUPT
    signal.Notify(cancelChan, syscall.SIGTERM, syscall.SIGINT)
    go func() {
        // start your software here. Maybe your need to replace the for loop with other code
        for {
            // replace the time.Sleep with your code
            log.Println("Loop tick")
            time.Sleep(time.Second)
        }
    }()
    sig := <-cancelChan
    log.Printf("Caught SIGTERM %v", sig)
    // shutdown other goroutines gracefully
    // close other resources
}
...