原本就有注意到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
不知道有沒有更好的解法