猿问

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")

    }


该应用程序大部分时间运行一两天都没有问题,但之后停止而没有任何错误。发生这种情况时,日志中的 sleep line 后没有日志。我可以添加任何内容以获取有关服务失败的更多信息。这里可能是什么问题?


慕雪6442864
浏览 254回答 1
微课
1回答

郎朗坤

select我将首先在in周围添加一个循环StartService(请参阅此示例)。从您提供的代码看来,您的服务将在收到任何可能是问题的信号(包括暂停/询问)后退出。添加一些进一步的登录StartService也可能是有益的(任何提供有关正在发生的事情的更多信息的东西都有帮助!)如果这不能解决问题,那么值得在 go 例程中添加延迟/恢复StartService并检查是否是恐慌导致了问题(只需向日志写入一些内容可能就足够了)。
随时随地看视频慕课网APP

相关分类

Go
我要回答