nats-server系统服务只能使用sc命令注册
目录
起因描述
windows环境下nats-server注册成系统, 官方推荐是sc命令
而我觉得sc命令台太麻烦, 为什么不用github.com/kardianos/service,或者更方便的工具呢?
方法一:使用nssm通过界面进行配置
- 下载地址
-
过程省略
-
结果死活不行,由于是第三方工具,出错找不到原因,放弃
方法二:通过服务外壳作为系统服务
- 介绍
使用go生成一个demo.exe,再将demo.exe注册成系统,demo.exe读取配置文件,然后demo.exe通过exec.Command启动nats-server.exe
go比较好用的库可以用github.com/kardianos/service
- demo.exe启动nats-server.exe关键源码
p.cmd = exec.Command(fullExec, p.Args...)
p.cmd.Dir = p.Dir
p.cmd.Env = append(os.Environ(), p.Env...)
- demo.json配置示例
{
"Name": "demo",
"DisplayName": "demo",
"Description": "demo for nats-server",
"Dir": "d:\\nats-server",
"Exec": "xxxx\\nats-server.exe",
"Args": ["-c ","xxx\\nats-server.conf"],
"Env": [
],
"Stderr": "C:\\log\\nats_err.log",
"Stdout": "C:\\log\\nats_out.log"
}
- 结果报错
The service process could not connect to the service controller.
意思是一个服务不能连接到另一个服务,啥意思呢? 也就是通过exec.Command启动的竟然是服务,不应该是exe么.
- nats-server启动源码分析
nats-server.exe的启动入口源码
func Run(server *Server) error {
//入口1:docker
if dockerized {
server.Start()
return nil
}
isInteractive, err := svc.IsAnInteractiveSession()
if err != nil {
return err
}
//入口2: 交互模式
if isInteractive {
server.Start()
return nil
}
//入口3: 启动服务(serviceName被写死了,只能是nats-server)
return svc.Run(serviceName, &winServiceWrapper{server})
}
- 错误原因总结
当以外壳方式启动时,走的是"入口3",也是启动服务,如果没有nats-server,它就啥事也没干,结果nats-server并没有启动
方法三:sc命令
官方推荐
总结
1、nat-server只能以sc命令注册成服务。怕麻烦可以写一个bat。
2、nats-server服务名只能是nats-server
佛說大乘無量壽莊嚴清淨平等覺經pdf 净土大经科注2014-doc 此生必看的科学实验-水知道答案 印光大师十念法(胡小林主讲第1集)