最近一个项目需要在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
...
取消快速编辑模式即可。
将exe注册成服务
尝试SC CREATE
注册服务,总是起不来,下面介绍传统方式。
首先要下载instsrv.exe和srvany.exe(下载地址),然后进入cmd命令窗口
- 输入命令
如D:\stack\instsrv.exe 服务名 D:\stack\srvany.exe
(exe需要绝对路径) - win+R输入
regedit
,进入注册列表,进入HKEY_LOCAL_MACHINE -> SYSTEM -> CurrentControlSet -> services -> 服务名
- 新建
Parameters
项,在Parameters
项里面新建AppDirectory
和Application
字符串值Application
的字符串的值需要指向exe文件(例如:D:\stack\test.exe)AppDirectory
的字符串的值只需要指向exe文件的目录(例如:D:\stack) - win+R 输入services.msc,将服务改成自动启动的,并启动服务。
注意:Application是可以跟参数的,比如使用go开发的test.exe 需要依赖环境配置文件.env,可以写为:D:\stack\test.exe -env=E:\config\.env
。