gpt4 book ai didi

linux - 无法在 golang 中捕获 upstart 发送的 SIGTERM

转载 作者:IT王子 更新时间:2023-10-29 01:48:35 26 4
gpt4 key购买 nike

我有一个 upstart 作业在运行(某种 TCP 服务器)。偶尔我的进程会重新启动,我可以在系统日志中看到下一行:

kernel: [2422352.460162] init: <job_name> main process (16545) killed by TERM signal

我不明白内核发出这个 TERM 信号的原因,所以我决定在终止之前捕获该信号并打印一些内存和 goroutines 统计信息。
所以现在我的代码看起来像这样:

func main() {
sigc := make(chan os.Signal, 1)
signal.Notify(sigc, syscall.SIGTERM)
go func() {
s := <-sigc
numOfGoRoutines := runtime. NumGoroutine()
var stats runtime.MemStats
runtime.ReadMemStats(&stats)
log.Println("Got Signal ", s)
log.Println("num of goroutines: ", numOfGoRoutines)
log.Println("Memory Allocated: ", stats.Alloc)
os.Exit(1)
}()
someInfiniteLoopFunction() // this function defined in a different file.

现在奇怪的是,即使我手动停止作业,我的 goroutine 也没有捕捉到 TERM 信号。
更有趣的是,如果我在信号处理程序 goroutine 之后立即添加一个 sleep 100 秒并在此 sleep 期间停止工作,那么我的 goroutine 确实会捕获 TERM 信号。
我在这里绝对一无所知,将不胜感激任何帮助。

最佳答案

UPD. 抱歉,我现在没看错。也许你的 goroutine 不等待信号并执行 os.Exit()。尝试添加另一个 channel 。

func main() {
sigc := make(chan os.Signal, 1)
done := make(chan bool, 1)
signal.Notify(sigc, syscall.SIGTERM)
go func() {

s := <-sigc
numOfGoRoutines := runtime. NumGoroutine()
var stats runtime.MemStats
runtime.ReadMemStats(&stats)
log.Println("Got Signal ", s)
log.Println("num of goroutines: ", numOfGoRoutines)
log.Println("Memory Allocated: ", stats.Alloc)
done <- true
os.Exit(1)
}()
<-done
someInfiniteLoopFunction() // this function defined in a different file.

关于linux - 无法在 golang 中捕获 upstart 发送的 SIGTERM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30734601/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com