原本就有注意到vscode中的"停止"(shift+F5)跟一般在CLI終止程式的行為不太一樣,原本是沒什麼問題,但像我現在的main底下長這樣:
func main() {
	var err error
	if err = setup(); err != nil {
		logger.MainLog().Error().Err(err).Msg("Server setup fail")
		return
	}
	srv := server.NewHttpServer(cfg.Server.Port)
	logger.MainLog().Info().Msg("Server start...")
	srv.RegisterRouter(route.GetHttpRouter())
	//start server
	if err = srv.Start(); err != nil {
		logger.MainLog().Error().Err(err).Msg("Server start fail")
		return
	}
	logger.MainLog().Info().Msg("Server start success")
	//run routine job
	routine.Run()
	//waiting shutdown
	quit := make(chan os.Signal, 1)
	signal.Notify(quit, os.Interrupt)
	<-quit
	signal.Reset(os.Interrupt)
	logger.MainLog().Info().Msg("Server shutdown...")
	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
	defer cancel()
	if err = srv.Shutdown(ctx); err != nil {
		logger.MainLog().Error().Err(err).Msg("Server shutdown fail")
		return
	}
	logger.MainLog().Info().Msg("Server shutdown success")
	if define.IsDebugMode {
		cmd := exec.Command(fmt.Sprintf("rm %s*.log", define.LogPath))
		if err = cmd.Run(); err != nil {
			logger.MainLog().Error().Err(err).Msg("")
			return
		}
	}
}
我是希望在debugmode中能在程式結束後自動刪除log path底下的log檔,這樣才方便我在開發階段查看
但目前vscode是直接終止掉我的程式,//waiting shutdown之後的程式都不會執行,查了一下laungh.json好像也沒有關於終止程式後的行為可以設定,請問我該怎麼做?
我目前是在linux底下運作的,vscode是run在dlv
目前找到一個solution,但跟我預想的還是有點落差
我有試著捕捉信號,但卻怎樣都抓不到,因此vscode在做"停止"時,應該是傳送SIGKILL(0x15)
因此目前我的作法是修改laungh.jsonlaungh.json:
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "debug mode",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${workspaceFolder}/src/main.go",
            "args":["--DEBUG_MODE"],
            "console": "integratedTerminal"
        }
    ]
}
這樣就會run在終端機而不是偵錯主控台,雖然vscode的"停止"按鈕一樣是kill,但可以在終端機內用ctrl+c來終止(原本的偵錯主控台不行)
code改成如下main.go
	//waiting shutdown
	quit := make(chan os.Signal, 1)
	signal.Notify(quit, syscall.SIGINT)
	<-quit
	signal.Reset(syscall.SIGINT)
	logger.MainLog().Info().Msg("Server shutdown...")
	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
	defer cancel()
	if err = srv.Shutdown(ctx); err != nil {
		logger.MainLog().Error().Err(err).Msg("Server shutdown fail")
		return
	}
	logger.MainLog().Info().Msg("Server shutdown success")
	//remove log file in the log path
	if define.IsDebugMode {
		cmd := exec.Command("/bin/bash", "-c", fmt.Sprintf("rm %s*.log", define.LogPath))
		if err = cmd.Run(); err != nil {
			logger.MainLog().Error().Err(err).Msg("")
			return
		}
	}
因為不是run在bash底下,所以command不能直接下,而是透過bash傳真的要執行的command
不知道有沒有更好的解法