본문으로 건너뛰기

윈도 서비스 컨트롤

윈도의 실행중인 여러 서비스를 중지시키거나 실행시키거나 하는 .. 서비스를 컨트롤 하는 함수입니다.

모두의 프린터를 만들면서 사용한 코드입니다.

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 참고하셔서 원하는 서비스명으로 적용 하시면 됩니다.