go安裝服務

golang 安裝程序爲服務

package main

import (
    "context"
    "fmt"
    "io"
    "log"
    "net/http"
    "os"
    "path/filepath"

    "github.com/gin-gonic/gin"
    "github.com/kardianos/service"
)

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:    ":8089",
        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())
    }
}

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章