go程序二进制要在windows下持续运行有很多方法,写个批处理、cmd常驻等都可以实现,今天的文章只讲使用windows services来管控go程序的情形。
go程序windows服务化后,启动|停止命令就可以成为:net start 服务名称
、net stop 服务名称
或者进入到Windows服务可视化界面手动点击后使用鼠标点击启动、停止功能按钮。
golang编写的程序一般以网络服务居多,绝大多数是部署在linux上的,当然这里只是说一般。
当然也有部分会出现需要部署在windows系统上的情况,windows也提供有类似守护进程的services或中文名称“服务”,比较遗憾的是并不是任意一个windows exe程序都可以直接使用windows系统的服务来管理。同理go程序编译后的exe可执行程序也是不能立即用windows服务管控的。那么有没有方案实现呢,go作为跨平台支持程序肯定是要支持的,有两种方案:
方案一、使用golang官方提供的windows包
go官方提供有正统的windows系统专用的如下包,用于与windows系统打交道, 里面有windows服务所需要的golang.org/x/sys/windows/svc
,使用该包即可使你的go程序适配windows服务。
- golang.org/x/sys/windows
- golang.org/x/sys/windows/registry
- golang.org/x/sys/windows/svc
- golang.org/x/sys/windows/svc/eventlog
-
golang.org/x/sys/windows/svc/mgr
当然,直接使用go官方原生windows相关包可能比较麻烦,社区也有已封装好的package,不要重复造轮子直接用:https://github.com/kardianos/service
这种方案是改造自己的程序以适配windows服务,具体使用方案网上一大把,我就不再赘述了,找了一篇文章:https://www.cnblogs.com/achillis/p/17994220
方案二、使用windows可执行程序services包装器
这个方案是今天主要介绍的。因为绝大多数情况下,我们的go程序都是在linux下跑的好好的,某些情况下需要在windows下。所以最好是不要改动我们的go程序。此种情况我们的go程序和诸如nginx、apache、mysql等可执行程序别无二致。此种方案本质上是一个包装器,把我们的可执行程序包裹包装后塞入到windows服务。
使用的工具包:https://github.com/winsw/winsw
对于我们的go程序而言,本质上就是把我们的go程序编译成一个二进制文件后使用。本次我们把一个简单的go程序编译成名为xx.exe
的可执行程序待用。
2.1、下载工具包
https://github.com/winsw/winsw/releases 找到一个版本,下载32位或64位的二进制文件待用,这个二进制文件就是包装器,用于包装我们的二进制文件。本次实验的windows是64位的,下载后放置到我们的go可执行程序的同目录文件夹下并改名,本次实验改为了wrap-go.exe
2.2、配置
因为包裹程序本身也需要知道如何去包裹执行目标二进制程序,所以提供了一个xml格式的配置文件,github里有示例,建立一个与改名后同名的xml文件,本例就是wrap-go.xml
,写入配置内容:
<service> <id>wrap-go</id> <name>wrap-go</name> <description>nginx web server</description> <executable>c:\Users\tvb\test\xx.exe</executable> </service>
当然官方提供的xml配置项也比较丰富,这不是本文的重点,详细的介绍在此:https://github.com/winsw/winsw/blob/v3/docs/xml-config-file.md
2.3、安装或初始化服务
就是在终端CMD里执行初始化包裹程序,以安装windows services。进入终端并进入到二进制和包裹程序所在的目录,然后执行 wrap-go install
2.4、服务即成
----
用好已有工具轮子,尽量不要造轮子。
哟嚯,本文评论功能关闭啦~