Ehco1996 / ehco

ehco is a network ʚrelayɞ tool and a typo :)

Home Page:https://docs.ehco-relay.cc/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

优雅退出是否有点问题

xpzouying opened this issue · comments

commented

> internal/cli/app.go:L17 的函数中,

func startAction(ctx *cli.Context) error {
	cfg, err := InitConfigAndComponents()
	if err != nil {
		cliLogger.Fatalf("InitConfigAndComponents meet err=%s", err.Error())
	}

	mainCtx, cancel := context.WithCancel(ctx.Context)
	defer cancel()

	exitSigs := make(chan os.Signal, 1)
	signal.Notify(exitSigs, syscall.SIGINT, syscall.SIGTERM)

	MustStartComponents(mainCtx, cfg)
	// wait for exit
	select {
	case <-mainCtx.Done():
	case <-exitSigs:
	}
	cliLogger.Infof("ehco exit now...")
	return nil
}

这里实现了优雅退出的逻辑,但是感觉有点问题,思路如下,

通过下面代码劫持到退出信号后,比如:syscall.SIGINT,

select {
	case <-mainCtx.Done():
	case <-exitSigs:
	}

此时会通过上面的 case <-exitSigs 分支退出,并且会结束掉当前 startAction 函数,
在退出时,会调用 cancel(),
此时,所有监听 <- mainCtx.Done() 会触发该信号,一般是用来关闭各种各样资源和退出。

但是此时会出现一种情况,就是释放资源较慢,这样就会导致 startAction() 结束或者整个进程结束后,仍然未完成资源的释放,所以就是否出现了:虽然做了优雅退出的逻辑处理,但是仍然未完美的做到“优雅退出”?

commented

的确是这样,可以考虑优化一下,收到退出信号时再等一下mainctx