使用Golang编写Windows服务
主要是使用”github.com/kardianos/service“这个库
它已经处理好了与服务管理器的交互细节,并且自带服务安装、卸载、启动、停止等功能,非常齐全了。
直接上完整代码:
package main
import (
"log"
"os"
"syscall"
"time"
"unsafe"
"github.com/kardianos/service"
)
var (
kernel32DLL = syscall.NewLazyDLL("kernel32.dll")
outputDebugString = kernel32DLL.NewProc("OutputDebugStringW")
)
func OutputDebugString(message string) {
strPtr, _ := syscall.UTF16PtrFromString(message)
outputDebugString.Call(uintptr(unsafe.Pointer(strPtr)))
}
// MyService 实现了 service.Service 接口
type MyService struct{}
func (m *MyService) Start(s service.Service) error {
go m.run()
return nil
}
func (m *MyService) run() {
OutputDebugString("Service start...")
// 在这里编写你的服务逻辑
for {
OutputDebugString("Service is running...")
time.Sleep(1 * time.Second)
}
}
func (m *MyService) Stop(s service.Service) error {
// 停止服务的逻辑
OutputDebugString("Service exit...")
return nil
}
func main() {
OutputDebugString("main starting...")
// 服务的名称、显示名称和描述
svcConfig := &service.Config{
Name: "MyGoService",
DisplayName: "My Golang Service",
Description: "This is a sample service by golang.",
}
prg := &MyService{}
s, err := service.New(prg, svcConfig)
if err != nil {
log.Fatal(err)
}
// 如果服务已经安装,可以通过以下命令来启动、停止、重启或卸载服务:
// service.exe install
// service.exe start
// service.exe stop
// service.exe restart
// service.exe uninstall
// 通过以下代码来控制服务的启动和停止
if len(os.Args) > 1 {
err = service.Control(s, os.Args[1])
if err != nil {
log.Fatal(err)
}
return
}
err = s.Run()
if err != nil {
log.Fatal(err)
}
}
编译完成后生成servicedemo.exe,然后直接执行以下命令进行安装:
servicedemo.exe install
然后在服务管理器中就可以看到服务了:

然后直接在服务管理器中启动或使用命令行”servicedemo.exe start“启动就可以了。
在服务中我使用OutputDebugString打印调试信息,所以打开DebugView就可以看到启动和停止的信息。

停止服务使用 "servicedemo.exe stop"
卸载服务使用"servicedemo.exe uninstall"
就是这么简单!

浙公网安备 33010602011771号