使用 SC 添加服务
sc create YourServiceName binPath="D:\fgap\fgap_server.exe" start=auto DisplayName="Your Service Name"
sc start YourServiceName
sc stop YourServiceName
sc delete YourServiceName
Go 程序直接部署
package main
import (
"fmt"
"log"
"os"
"os/signal"
"syscall"
"github.com/kardianos/service"
)
type myProgram struct{}
var done = make(chan bool, 1)
func (p *myProgram) Start(s service.Service) error {
go p.run()
return nil
}
func (p *myProgram) run() {
log.Println("Service running...")
// 在这里添加你的服务逻辑代码
<-done
comm.Log.Warn("caught signal, stopping...")
}
func (p *myProgram) Stop(s service.Service) error {
log.Println("Service stopped.")
go func() {
done <- true
}()
return nil
}
func main() {
svcConfig := &service.Config{
Name: "MyService",
DisplayName: "My Go Service",
Description: "This is a Windows service written in Go.",
}
prg := &myProgram{}
// 检查是否以服务方式运行
if service.Interactive() {
fmt.Println("Running in terminal.")
if len(os.Args) > 1 {
serviceAction := os.Args[1]
switch serviceAction {
case "install":
err := s.Install()
if err != nil {
fmt.Println("安装服务失败: ", err.Error())
} else {
fmt.Println("安装服务成功")
}
return
case "uninstall":
err := s.Uninstall()
if err != nil {
fmt.Println("卸载服务失败: ", err.Error())
} else {
fmt.Println("卸载服务成功")
}
return
case "start":
err := s.Start()
if err != nil {
fmt.Println("运行服务失败: ", err.Error())
} else {
fmt.Println("运行服务成功")
}
return
case "stop":
err := s.Stop()
if err != nil {
fmt.Println("停止服务失败: ", err.Error())
} else {
fmt.Println("停止服务成功")
}
return
}
} else {
prg.run()
}
} else {
s, err := service.New(prg, svcConfig)
if err != nil {
log.Fatal(err)
}
// 以服务方式运行
if err = s.Run(); err != nil {
log.Fatal(err)
}
}
// 监听系统信号,捕获退出信号
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)
<-sigCh
}