Windows部署go exe应用笔记

近一个项目需要在windows下部署,技术选型就使用go来开发,打包exe运行,但是部署到服务器后,遇到一个奇怪的bug,当双击cmd窗口时,进程会被挂起,回车又恢复执行。起初以为时go的标准输入导致的,后尝试关掉stdout也无济于事,一番Google后,原来win10或者win server 2016新增了feature 快速编辑模式,当使用该模式时即双击可以挂起程序,回车恢复。🤬

快速编辑模式

这里简单演示下:

func main()  {
	for {
		fmt.Println(time.Now())
		time.Sleep(time.Second)
	}
}

打包

go build test-cmd.go

双击执行

2020-06-12 17:14:13.5464216 +0800 CST m=+0.008998901
2020-06-12 17:14:14.5743305 +0800 CST m=+1.036907801
...

cmd-q.png

取消快速编辑模式即可。

将exe注册成服务

尝试SC CREATE注册服务,总是起不来,下面介绍传统方式。

首先要下载instsrv.exe和srvany.exe(下载地址),然后进入cmd命令窗口

  1. 输入命令如D:\stack\instsrv.exe 服务名 D:\stack\srvany.exe(exe需要绝对路径)
  2. win+R输入regedit,进入注册列表,进入HKEY_LOCAL_MACHINE -> SYSTEM -> CurrentControlSet -> services -> 服务名
  3. 新建Parameters项,在Parameters项里面新建AppDirectoryApplication 字符串值Application的字符串的值需要指向exe文件(例如:D:\stack\test.exe)AppDirectory的字符串的值只需要指向exe文件的目录(例如:D:\stack)
  4. win+R 输入services.msc,将服务改成自动启动的,并启动服务。

注意:Application是可以跟参数的,比如使用go开发的test.exe 需要依赖环境配置文件.env,可以写为:D:\stack\test.exe -env=E:\config\.env

updatedupdated2020-06-182020-06-18
Load Comments?