golang Windows服务失败,没有任何错误

问题描述

我已经使用golang编写了一个简单的Windows服务。

package main

import "golang.org/x/sys/windows/svc"
import "io/ioutil"
import "log"
import "encoding/json"
import "time"
import "strconv"
import "os"
import "./cmd"
import "golang.org/x/sys/windows/svc/eventlog"
import "fmt"

type myservice struct{}

func (m *myservice) Execute(args []string,r <-chan svc.ChangeRequest,changes chan<- svc.Status) (ssec bool,errno uint32) {
    log.Println("Starting service")
    const cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown | svc.AcceptPauseAndContinue
    changes <- svc.Status{State: svc.StartPending}
    changes <- svc.Status{State: svc.Running,Accepts: cmdsAccepted}
    StartService(r,changes)
    return
}

//RunService Runs the current application as a service.It will send the necessary flags to windows.
func RunService(maintServiceName string) {
    //var elog eventlog

    elog,evtErr := eventlog.Open(maintServiceName)
    if evtErr != nil {
        return
    }

    defer elog.Close()
    log.Println("Running service")
    elog.Info(1,fmt.Sprintf("starting %s service",maintServiceName))

    run := svc.Run
    sererr := run(maintServiceName,&myservice{})
    if sererr != nil {
        elog.Error(1,fmt.Sprintf("%s service failed: %v",maintServiceName,sererr))
    }
}

//StartService Starts the Service
func StartService(r <-chan svc.ChangeRequest,changes chan<- svc.Status) {
    const cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown | svc.AcceptPauseAndContinue
    jsonFile,err := os.Open("config.json")
    if err != nil {
        log.Fatalln("No configuration found")
    }
    byteVal,_ := ioutil.ReadAll(jsonFile)
    var result map[string]interface{}
    json.Unmarshal([]byte(byteVal),&result)
    var serverURL = result["serverURL"]
    var serviceName = result["serviceName"]
    var intervalStr = result["interval"].(string)
    var intervalInt,parseErr = strconv.ParseInt(intervalStr,10,32)
    if parseErr != nil {
        intervalInt = 60
    }

    log.Println("server Url ",serverURL)
    log.Println("service name ",serviceName)

    cmd.SetServerURL(serverURL.(string))
    cmd.SetServiceName(serviceName.(string))
    log.Println("Running Thread")

    go func() {
        for {
            log.Println("sleeping ")
            time.Sleep(time.Duration(intervalInt) * time.Second)
            cmd.Connect()
        }
    }()

    select {
    case c := <-r:
        if c.Cmd == svc.Stop || c.Cmd == svc.Shutdown {
            break
        }
        if c.Cmd == svc.Interrogate {
            changes <- c.CurrentStatus
            time.Sleep(100 * time.Millisecond)
            changes <- c.CurrentStatus
        }
        if c.Cmd == svc.Pause {
            changes <- svc.Status{State: svc.Paused,Accepts: cmdsAccepted}
        }
        if c.Cmd == svc.Continue {
            changes <- svc.Status{State: svc.Running,Accepts: cmdsAccepted}
        }
    }

}

该应用程序大多数情况下在一两天内运行都没有问题,但此后停止运行而没有任何错误。发生睡眠行后,日志中没有日志。我可以添加任何东西以获得有关服务故障的更多信息。这可能是什么问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)