按我理解,zrpc server端在收到SIGTERM信号时,确实需要走gracefulStop方法安全退出 但由于client.go和server.go同在package zrpc下,所以同样会调用到core/proc的init()方法,同样会监听信号。这里是不是稍微不太合理?
而且gracefulStop()方法在实现上,貌似也有点问题:
func gracefulStop(signals chan os.Signal) {
signal.Stop(signals)
logx.Info("Got signal SIGTERM, shutting down...")
wrapUpListeners.notifyListeners()
time.Sleep(wrapUpTime)
shutdownListeners.notifyListeners()
time.Sleep(delayTimeBeforeForceQuit - wrapUpTime)
logx.Infof("Still alive after %v, going to force kill the process...", delayTimeBeforeForceQuit)
syscall.Kill(syscall.Getpid(), syscall.SIGTERM)
}
这里看起来是,收到SIGTERM之后,会关闭所有的listener,然后sleep几秒,然后再给自己发一个SIGTERM 所以理论上这个方法执行结束之前,程序都不会正式退出 但sleep几秒之后,日志中却提示still alive,给人的感觉就是程序异常了,没有正常退出 这里是不是不太合理?