// serviceMain checks whether we're being invoked as a service, and if so uses // the service control manager to start the long-running server. A flag is // returned to the caller so the application can determine whether to exit (when // running as a service) or launch in normal interactive mode. func serviceMain() (bool, error) { // Don't run as a service if we're running interactively (or that can't // be determined due to an error). isInteractive, err := svc.IsAnInteractiveSession() if err != nil { return false, err } if isInteractive { return false, nil } elog, err = eventlog.Open(svcName) if err != nil { return false, err } defer elog.Close() err = svc.Run(svcName, &btcdService{}) if err != nil { elog.Error(1, fmt.Sprintf("Service start failed: %v", err)) return true, err } return true, nil }
func main() { const svcName = "myservice" isIntSess, err := svc.IsAnInteractiveSession() if err != nil { log.Fatalf("failed to determine if we are running in an interactive session: %v", err) } if !isIntSess { runService(svcName, false) return } if len(os.Args) < 2 { usage("no command specified") } cmd := strings.ToLower(os.Args[1]) switch cmd { case "debug": runService(svcName, true) return case "install": err = installService(svcName, "my service") case "remove": err = removeService(svcName) case "start": err = startService(svcName) case "stop": err = controlService(svcName, svc.Stop, svc.Stopped) case "pause": err = controlService(svcName, svc.Pause, svc.Paused) case "continue": err = controlService(svcName, svc.Continue, svc.Running) default: usage(fmt.Sprintf("invalid command %s", cmd)) } if err != nil { log.Fatalf("failed to %s %s: %v", cmd, svcName, err) } return }