首页 > 系统相关 >使用Golang编写Windows服务

使用Golang编写Windows服务

时间:2024-01-29 12:12:28浏览次数:36  
标签:exe 服务 service err Windows Service Golang MyService 编写

主要是使用”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"

就是这么简单!

标签:exe,服务,service,err,Windows,Service,Golang,MyService,编写
From: https://www.cnblogs.com/achillis/p/17994220

相关文章

  • 2024最新Windows11专业版
    Windows11专业版是微软公司推出的操作系统,是Windows10的继任者。它拥有全新的界面设计、改进的性能和安全功能,支持Android应用程序运行,并提供更流畅的多任务体验。专业版还包含企业级功能,适用于商业用户,提供更强大的管理和安全性能。微软Windows11官方ISO镜像下载地址:www.mic......
  • 2024最新Windows11专业版Windows11专业工作站版
    微软Windows11官方ISO镜像下载地址:www.microsoft.com/zh-cn/softw…Windows11专业版是微软最新的操作系统,为用户提供先进的界面设计和多项升级功能,包括重新设计的任务栏、全新的启动菜单、虚拟桌面和直观的窗口管理。专业版还提供更强大的安全性和企业级功能,满足专业用户的需......
  • VMware - Windows 10 1909 Version 安装
    (注意:使用VMwareworkstation16pro安装windows10的22h2版本可能失败,需要回滚到1909Version即可)VMware虚拟机软件:我使用的VMware版本是VMwareWorkstation16Pro,官网下载试用WindowsISO:版本是cn_windows_10_consumer_editions_version_1909_updated_jan_2020_x64_dvd_4......
  • Windows 安装 MySQL 5.8 -- 输入3次 密码错误锁定账户
    安装下载地址:https://downloads.mysql.com/archives/installer/需要有.netframework4.5.2及以上版本才能安装MySQL5.8选择自定义安装选择要安装的服务修改安装路径设置ROOT密码,测试错误锁定帐号MySQL8.0.19版本之后,新增了一个功能,支持了输入3次......
  • Windows11专业版下载地址
    Windows11专业版是微软公司推出的操作系统,是Windows10的继任者。它拥有全新的界面设计、改进的性能和安全功能,支持Android应用程序运行,并提供更流畅的多任务体验。专业版还包含企业级功能,适用于商业用户,提供更强大的管理和安全性能。微软Windows11官方ISO镜像下载地址:www.mic......
  • 26从零开始用Rust编写nginx,如何发布Rust项目到Docker
    wmproxywmproxy已用Rust实现http/https代理,socks5代理,反向代理,静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子项目地址国内:https://gitee.com/tickbh/wmproxygithub:https://github.com/tickbh/wmproxy容......
  • docker安装windows
    声明:文章转载于微信公众号:高等精灵实验室,更多详情请移步原文保姆级:在NAS上使用Docker跑一个Windows系统,支持远程桌面,有点意思!​原创......
  • windows环境安装grpcui
    1. 首先安装golang语言环境  go语言中文官方下载地址:https://studygolang.com/dl选择windows版本 下载完成后直接双击msi文件根据提示进行安装安装成功后把安装目录配到环境变量例如,我安装到D盘下 命令行查看go version 安装成功 2. 安装grpcui包官方地......
  • Windows Server2012安装WireShark
    一、环境说明WindowsServer2012R2版本64位;安装wireshark二、问题描述安装wireshark提示TheVisualC++Redistributableinstallerfailedwitherror23PleasemakesureyouhaveKB2999226orKB3118401installed.Unabletocontinueinstallation.三、解决方法1......
  • Golang中的交叉编译
    Golang中的交叉编译在Golang中,交叉编译指的是在同一台机器上生成针对不同操作系统或硬件架构的二进制文件。这在开发跨平台应用或构建特定平台的发布版本时非常有用。交叉编译Golang程序的基本步骤如下:指定目标操作系统和工具链并设置对应的环境变量在编译时,需要指定目标......