【发布时间】:2015-08-24 10:07:53
【问题描述】:
我有一个新贵的工作正在运行(某种 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 之后立即添加一个睡眠 100 秒并在此睡眠期间停止作业,那么我的 goroutine 确实捕获了 TERM 信号。
我在这里绝对一无所知,并会感谢任何帮助。
【问题讨论】:
-
您确定您没有捕捉到
TERM信号吗?也许输出正在被暴发户丢弃。尝试登录到文件。 -
@JimB 伙计,你是对的!我设法写入文件。为什么暴发户放弃输出?谢谢!
-
Upstart 的
wait调用可能会在输出缓冲某处并被丢弃时返回。短暂的睡眠可能会有所帮助,但没有办法让它万无一失。