nats-server系統服務只能使用sc命令註冊

語言: CN / TW / HK

起因描述

windows環境下nats-server註冊成系統, 官方推薦是sc命令

而我覺得sc命令臺太麻煩, 為什麼不用github.com/kardianos/service,或者更方便的工具呢?

方法一:使用nssm通過介面進行配置

1. 下載地址

http://nssm.cc/download

2. 過程省略

3. 結果死活不行,由於是第三方工具,出錯找不到原因,放棄

方法二:通過服務外殼作為系統服務

* 介紹

使用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集)