<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # in 項目作為windows服務運行 前言 在windows操作系統上是沒有守護進程的說法,golang原生不支持注冊成windows服務,如果想要實現windows服務,就需要借助第三方庫 github.com/kardianos/service 這里以 gin 框架做為 web項目,實現windows服務的效果。(這里記錄一下) 一、代碼如下 1.代碼示例 ``` package main import ( "context" "fmt" "github.com/gin-gonic/gin" "github.com/kardianos/service" "io" "log" "net/http" "os" "path/filepath" ) type Services struct { Log service.Logger Srv *http.Server Cfg *service.Config } // 獲取可執行文件的絕對路徑 func ExecPath() string { file, e := os.Executable() if e != nil { log.Printf("Executable file path error : %s\n", e.Error()) } path := filepath.Dir(file) return path } // 獲取 service 對象 func getSrv() service.Service { File, err := os.Create(ExecPath() + "/http-server.log") if err != nil { File = os.Stdout } defer File.Close() log.SetOutput(File) s := &Services{ Cfg: &service.Config{ Name: "goWeb", DisplayName: "goWeb", Description: "基于gin的web服務", }} serv, er := service.New(s, s.Cfg) if er != nil { log.Printf("Set logger error:%s\n", er.Error()) } s.Log, er = serv.SystemLogger(nil) return serv } // 啟動windows服務 func (srv *Services) Start(s service.Service) error { if srv.Log != nil { srv.Log.Info("Start run http server") } go srv.StarServer() return nil } // 停止windows服務 func (srv *Services) Stop(s service.Service) error { if srv.Log != nil { srv.Log.Info("Start stop http server") } log.Println("Server exiting") return srv.Srv.Shutdown(context.Background()) } // 運行gin web服務 func (srv *Services) StarServer() { gin.DisableConsoleColor() // 創建記錄日志的文件 f, _ := os.Create(ExecPath() + "/gin.log") gin.DefaultWriter = io.MultiWriter(f) router := gin.Default() router.GET("/test", func(c *gin.Context){ c.String(http.StatusOK, "Welcome Gin Server") }) srv.Srv = &http.Server{ Addr: ":8080", Handler: router, } srv.Srv.ListenAndServe() } func main() { s := getSrv() if len(os.Args) > 1 { switch os.Args[1] { case "install": err := s.Install() if err != nil { log.Fatalf("Install service error:%s\n", err.Error()) } fmt.Printf("服務已安裝") case "uninstall": err := s.Uninstall() if err != nil { log.Fatalf("Uninstall service error:%s\n", err.Error()) } fmt.Printf("服務已卸載") case "start": err := s.Start() if err != nil { log.Fatalf("Start service error:%s\n", err.Error()) } fmt.Printf("服務已啟動") case "stop": err := s.Stop() if err != nil { log.Fatalf("top service error:%s\n", err.Error()) } fmt.Printf("服務已關閉") } return } err := s.Run() if err != nil { log.Fatalf("Run programe error:%s\n", err.Error()) } } ``` ![](https://img.kancloud.cn/e0/9f/e09f1d7a50ca9c31a23bc5ca9a21a6d2_628x430.png) ![](https://img.kancloud.cn/f7/da/f7da6197b294b6caa289f5841274c5fa_393x125.png) ![](https://img.kancloud.cn/ed/cd/edcd8d316841b6a0dadd4c17bdd5f211_585x403.png) ![](https://img.kancloud.cn/6a/ee/6aee5420a3908b1525689ac434abdb92_337x178.png) 2、運行服務1053錯誤 錯誤描述 啟動windows服務時提示,“無法啟動XXX服務,錯誤 1053:服務沒有及時響應啟動或控制請求”,錯誤原因有以下兩個原因: 項目初始化時間過長,windows服務啟動時間是毫秒級的,如果初始加載太多東西,會導致服務啟動時間過長然后報1053錯誤。 ``` 解決辦法:建議 start windows 服務時,新開一個協程單獨啟動 web 服務。 比如:示例中: go srv.StarServer() 這里單獨一個協程啟動web服務器 ``` 項目中有讀寫文件,比如:讀配置文件。直接 go run 命令運行項目時沒有任何問題,作為windows服務啟動時報錯。這是由于windows服務啟動exe文件后的工作目錄,并不是exe文件的所在目錄,而是變更到了C:\Windows\System32,所以如果配置文件是相對路徑,那么這樣是找不到配置文件的,就會報錯1053 ``` 解決辦法: 如果項目中有讀寫文件,加載配置時,使用絕對路徑。 ``` 原文: https://blog.csdn.net/qq673675158/article/details/118152084
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看