golang.org/x/sys@v0.9.0/windows/svc/example/manage.go (about) 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 package main 9 10 import ( 11 "fmt" 12 "time" 13 14 "golang.org/x/sys/windows/svc" 15 "golang.org/x/sys/windows/svc/mgr" 16 ) 17 18 func startService(name string) error { 19 m, err := mgr.Connect() 20 if err != nil { 21 return err 22 } 23 defer m.Disconnect() 24 s, err := m.OpenService(name) 25 if err != nil { 26 return fmt.Errorf("could not access service: %v", err) 27 } 28 defer s.Close() 29 err = s.Start("is", "manual-started") 30 if err != nil { 31 return fmt.Errorf("could not start service: %v", err) 32 } 33 return nil 34 } 35 36 func controlService(name string, c svc.Cmd, to svc.State) error { 37 m, err := mgr.Connect() 38 if err != nil { 39 return err 40 } 41 defer m.Disconnect() 42 s, err := m.OpenService(name) 43 if err != nil { 44 return fmt.Errorf("could not access service: %v", err) 45 } 46 defer s.Close() 47 status, err := s.Control(c) 48 if err != nil { 49 return fmt.Errorf("could not send control=%d: %v", c, err) 50 } 51 timeout := time.Now().Add(10 * time.Second) 52 for status.State != to { 53 if timeout.Before(time.Now()) { 54 return fmt.Errorf("timeout waiting for service to go to state=%d", to) 55 } 56 time.Sleep(300 * time.Millisecond) 57 status, err = s.Query() 58 if err != nil { 59 return fmt.Errorf("could not retrieve service status: %v", err) 60 } 61 } 62 return nil 63 }