如何将Golang的exe文件转换为服务

如何将Golang的exe文件转换为服务 我想将Go的.exe文件转换为服务,请问你能帮我实现这个功能吗?

3 回复

你好,Charles,

请查看 x/sys/windows/svc 包及其示例代码:example command - golang.org/x/sys/windows/svc/example - Go Packages

更多关于如何将Golang的exe文件转换为服务的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我想将Go的.exe文件转换为服务

这有帮助吗?

Medium – 18 May 22

如何在Golang中构建服务

缩略图

当我们开始学习Go时,会发现很多关于如何构建新的Web服务器或执行特定任务的例子。然而,要构建一个在后台运行、处理请求并与其他服务通信的服务可能会很有挑战性……

阅读时间:3分钟

在我看来,服务既可以是独立运行、不与其他服务通信的服务器(例如一个定时任务服务),也可以是专门为通信而构建的服务(如REST API等)。我所有的服务都是“普通”的Go可执行文件(无需转换),它们使用不同的端口,并在服务器上单独启动。

在Windows系统中,你可以使用sc命令或第三方工具如NSSM将Go编译的.exe文件注册为系统服务。以下是两种方法的实现示例:

方法一:使用sc命令(需管理员权限)

// 编译为myapp.exe后,在cmd中执行:
sc create MyGoService binPath= "C:\path\to\myapp.exe" start= auto

方法二:使用NSSM(推荐)

  1. 下载NSSM:https://nssm.cc/download
  2. 注册服务:
nssm install MyGoService C:\path\to\myapp.exe

方法三:使用Go代码实现服务化

安装服务管理包:

go get github.com/kardianos/service

示例代码:

package main

import (
    "fmt"
    "github.com/kardianos/service"
    "time"
)

type program struct{}

func (p *program) Start(s service.Service) error {
    go p.run()
    return nil
}

func (p *program) run() {
    // 你的业务逻辑
    for {
        fmt.Println("Service is running...")
        time.Sleep(5 * time.Second)
    }
}

func (p *program) Stop(s service.Service) error {
    return nil
}

func main() {
    svcConfig := &service.Config{
        Name:        "MyGoService",
        DisplayName: "My Go Service",
        Description: "This is a Go service example",
    }

    prg := &program{}
    s, err := service.New(prg, svcConfig)
    if err != nil {
        fmt.Println(err)
        return
    }

    // 通过命令行参数控制服务
    if len(os.Args) > 1 {
        switch os.Args[1] {
        case "install":
            s.Install()
        case "uninstall":
            s.Uninstall()
        case "start":
            s.Start()
        case "stop":
            s.Stop()
        }
        return
    }

    s.Run()
}

编译后使用:

# 安装服务
myapp.exe install

# 启动服务
myapp.exe start

# 停止服务
myapp.exe stop

选择适合你需求的方法即可实现Go程序的Windows服务化部署。

回到顶部