1// Copyright 2012 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5//go:build windows 6// +build windows 7 8// Example service program that beeps. 9// 10// The program demonstrates how to create Windows service and 11// install / remove it on a computer. It also shows how to 12// stop / start / pause / continue any service, and how to 13// write to event log. It also shows how to use debug 14// facilities available in debug package. 15// 16package main 17 18import ( 19 "fmt" 20 "log" 21 "os" 22 "strings" 23 24 "golang.org/x/sys/windows/svc" 25) 26 27func usage(errmsg string) { 28 fmt.Fprintf(os.Stderr, 29 "%s\n\n"+ 30 "usage: %s <command>\n"+ 31 " where <command> is one of\n"+ 32 " install, remove, debug, start, stop, pause or continue.\n", 33 errmsg, os.Args[0]) 34 os.Exit(2) 35} 36 37func main() { 38 const svcName = "myservice" 39 40 inService, err := svc.IsWindowsService() 41 if err != nil { 42 log.Fatalf("failed to determine if we are running in service: %v", err) 43 } 44 if inService { 45 runService(svcName, false) 46 return 47 } 48 49 if len(os.Args) < 2 { 50 usage("no command specified") 51 } 52 53 cmd := strings.ToLower(os.Args[1]) 54 switch cmd { 55 case "debug": 56 runService(svcName, true) 57 return 58 case "install": 59 err = installService(svcName, "my service") 60 case "remove": 61 err = removeService(svcName) 62 case "start": 63 err = startService(svcName) 64 case "stop": 65 err = controlService(svcName, svc.Stop, svc.Stopped) 66 case "pause": 67 err = controlService(svcName, svc.Pause, svc.Paused) 68 case "continue": 69 err = controlService(svcName, svc.Continue, svc.Running) 70 default: 71 usage(fmt.Sprintf("invalid command %s", cmd)) 72 } 73 if err != nil { 74 log.Fatalf("failed to %s %s: %v", cmd, svcName, err) 75 } 76 return 77} 78