使用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"
就是这么简单!