윈도의 실행중인 여러 서비스를 중지시키거나 실행시키거나 하는 .. 서비스를 컨트롤 하는 함수입니다.
모두의 프린터를 만들면서 사용한 코드입니다.
Bash
go get golang.org/x/sys/windows/svc
go get golang.org/x/sys/windows/svc/mgr이 두놈이 필요하구요 go get .. 고고
Go
package main
import (
"fmt"
"strings"
"time"
"golang.org/x/sys/windows/svc"
"golang.org/x/sys/windows/svc/mgr"
)
/**
* 서비스 시작
**/
func startService(name string) error {
m, err := mgr.Connect()
if err != nil {
return err
}
defer m.Disconnect()
s, err := m.OpenService(name)
if err != nil {
return fmt.Errorf("could not access service: %v", err)
}
defer s.Close()
err = s.Start("is", "manual-started")
if err != nil {
return fmt.Errorf("could not start service: %v", err)
}
return nil
}
/**
* 서비스 정지, 일시중지
**/
func controlService(name string, c svc.Cmd, to svc.State) error {
m, err := mgr.Connect()
if err != nil {
return err
}
defer m.Disconnect()
s, err := m.OpenService(name)
if err != nil {
return fmt.Errorf("could not access service: %v", err)
}
defer s.Close()
status, err := s.Control(c)
if err != nil {
return fmt.Errorf("could not send control=%d: %v", c, err)
}
timeout := time.Now().Add(10 * time.Second)
for status.State != to {
if timeout.Before(time.Now()) {
return fmt.Errorf("timeout waiting for service to go to state=%d", to)
}
time.Sleep(300 * time.Millisecond)
status, err = s.Query()
if err != nil {
return fmt.Errorf("could not retrieve service status: %v", err)
}
}
return nil
}
/**
* 프린트 스풀러 서비스 시작, 정지
**/
func startSpooler() error {
return startService("spooler")
}
func stopSpooler() error {
return controlService("spooler", svc.Stop, svc.Stopped)
}startSpooler , stopSpooler 참고하셔서 원하는 서비스명으로 적용 하시면 됩니다.