func (ws *windowsService) Run() error { ws.setError(nil) if !interactive { // Return error messages from start and stop routines // that get executed in the Execute method. // Guarded with a mutex as it may run a different thread // (callback from windows). runErr := svc.Run(ws.Name, ws) startStopErr := ws.getError() if startStopErr != nil { return startStopErr } if runErr != nil { return runErr } return nil } err := ws.i.Start(ws) if err != nil { return err } sigChan := make(chan os.Signal) signal.Notify(sigChan, os.Interrupt, os.Kill) <-sigChan return ws.i.Stop(ws) }
func runService(isDebug bool) { defer utils.Recover_and_log() logging.Debug("runService") err = svc.Run(command.PrimaryService.Name(), &serviceHandler{}) if err != nil { logging.Errorf("runService: failed: %v\r\n", err) } }
func (ws *windowsService) Run(onStart, onStop func() error) error { elog, err := eventlog.Open(ws.name) if err != nil { return err } defer elog.Close() ws.logger = elog ws.onStart = onStart ws.onStop = onStop return svc.Run(ws.name, ws) }
func main() { elog, err := eventlog.Open(name) if err != nil { log.Fatal(err.Error()) } defer elog.Close() // `svc.Run` blocks until windows service will stopped. // ref. https://msdn.microsoft.com/library/cc429362.aspx err = svc.Run(name, &handler{elog: elog}) if err != nil { log.Fatal(err.Error()) } }
// Returns true if we detected that we are not running in a non-interactive session, and so // launched the service. This function will not return until the service exits. func RunAsService(handler func()) bool { interactive, err := svc.IsAnInteractiveSession() if err != nil { log.Fatalf("failed to determine if we are running in an interactive session: %v", err) return false } if interactive { return false } serviceName := "" // this doesn't matter when we are a "single-process" service service := &myservice{ handler: handler, } svc.Run(serviceName, service) return true }