태그 보관물: Golang

Go(Golang) 언어로 윈도우즈 서비스 프로그램 만들기

개요

주기적으로 폴더를 감시해서 파일 처리하는 프로그램을 개발하게 되었습니다. 윈도우즈 기반 서버에서 서비스 형태로 동작하는 것이 우선적인 목표였습니다. 그런데 윈도우즈가 아닌 리눅스 서버에서도 동작할 수도 있다는 조건이 추가되었습니다. 멀티 플랫폼을 지원하는 Go(Golang) 언어로 개발하게 되었습니다.

패키지

Go(Golang) 언어에서는 윈도우 서비스 프로그램 제작 기능을 기본적으로 지원하지 않습니다. 그래서 윈도우 서비스 프로그램을 제작할 수 있게 도와주는 패키지( https://github.com/kardianos/service)를 이용했습니다. 사이트에 접속해 보면 Go 프로그램을 주요 플랫폼에서 서비스 형태로 실행할 수 있게 해준다고 설명되어 있습니다. example 폴더의 파일을 참조해서 개발하시면 됩니다.

윈도우 서비스 개발

다음의 소스와 같이 작업하면 윈도우 서비스 프로그램이 됩니다. run 함수내에 작업하고자 하는 내용을 추가하시면 됩니다. 빌드 후 실행해 보면 명령 프롬프트에서 실행이 됩니다.

package main

import (
	"log"

	"github.com/kardianos/service"
)

type GoWindowsService struct{}

func (goWindowsService *GoWindowsService) Start(windowsService service.Service) error {
	go goWindowsService.run()
	return nil
}

func (goWindowsService *GoWindowsService) run() {
	// Do your work here
	log.Println("Run!")
}

func (goWindowsService *GoWindowsService) Stop(windowsService service.Service) error {
	return nil
}

func main() {
	serviceConfig := &service.Config{
		Name:        "GoWindowsService",
		DisplayName: "Go Windows service",
		Description: "Go Windows service",
	}

	goWindowsService := &GoWindowsService{}
	windowsService, err := service.New(goWindowsService, serviceConfig)
	if err != nil {
		log.Println(err)
	}

	err = windowsService.Run()
	if err != nil {
		log.Println(err)
	}
}

주의하실 사항은 main 함수에는 서비스 실행 코드만 있어야 합니다. 다른 코드가 있으면 서비스 등록 후 실행하면 다음의 오류가 발생할 수 있습니다.

서비스가 시작이나 제어 요청에 빠르게 응답하지 않았습니다.

서비스 등록

프로그램은 실행할 수 있지만 서비스 프로그램 목록에는 나타나지 않습니다. 다음과 같은 방법으로 등록 합니다. 명령 프롬프트는 관리자 권한으로 실행한 후 다음 명령을 실행합니다. 주의하실 사항은 binPath= 뒤쪽에 공백이 있어야 합니다. sc 유틸리티에 대한 설명은 여기에서 확인하실 수 있습니다.

sc create "Go Windows Service" binPath= yourpath\your_windows_service.exe
sc description "Go Windows Service" "Go Windows Service Description"
sc start "Go Windows Service"

등록 명령을 실행하면 [SC] CreateService 성공, [SC] ChangeServiceConfig2 성공 이라는 메시지가 각각 나타납니다. sc start 는 해당 서비스를 바로 실행하는 명령어 입니다. 다음과 같이 서비스 리스트에 등록된 것을 확인할 수 있습니다.

서비스 등록

서비스 삭제

다음 명령으로 서비스를 삭제합니다. sc stop 명령어는 해당 서비스를 중지합니다.

sc stop "Go Windows Service"
sc delete "Go Windows Service"

Go(Golang) 언어로 윈도우즈 서비스 프로그램을 만들고 등록, 삭제하는 방법을 알아보았습니다.