From 87b9f47abc690fd5a3605e893bd5427ce935bb11 Mon Sep 17 00:00:00 2001 From: wjqserver <114663932+WJQSERVER@users.noreply.github.com> Date: Tue, 25 Mar 2025 08:20:08 +0800 Subject: [PATCH] add graceful shutdown --- main.go | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/main.go b/main.go index 1c03372..1537748 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,7 @@ package main import ( + "context" "embed" "flag" "fmt" @@ -8,6 +9,8 @@ import ( "io/fs" "net/http" "os" + "os/signal" + "syscall" "time" "ghproxy/api" @@ -334,10 +337,37 @@ func main() { if showVersion || showHelp { return } - err := router.Run(fmt.Sprintf("%s:%d", cfg.Server.Host, cfg.Server.Port)) - if err != nil { - logError("Failed to start server: %v\n", err) + + server := &http.Server{ + Addr: fmt.Sprintf("%s:%d", cfg.Server.Host, cfg.Server.Port), + Handler: router, } - defer logger.Close() + + quit := make(chan os.Signal, 1) + signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) + + /* + go func() { + err := router.Run(fmt.Sprintf("%s:%d", cfg.Server.Host, cfg.Server.Port)) + if err != nil { + logError("Failed to start server: %v\n", err) + } + }() + */ + + go func() { + if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { + logError("Failed to start server: %v\n", err) + os.Exit(1) + } + }() + + <-quit + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + if err := server.Shutdown(ctx); err != nil { + logError("Server forced to shutdown: %v\n", err) + } + defer cancel() + logger.Close() fmt.Println("Program Exit") }