Go 언어로 Windows Service 만들기

5076 단어 Go

의 목적


Go 언어로 제작된 프로그램을 사용하여 Windows 서비스화를 실현할 수 있는 방법을 생각해 보세요!
가능하다면, 나는 같은 원본 코드를 사용하고 싶고, 리눅스의 Systemd 서비스도 사용할 수 있다.
나는 많은 생각을 하고 찾아보니 매우 편리한 포장이 있었다.
Linux는 모든 것이 가능하기 때문에 먼저 Windows Service화를 시도했습니다.

사용할 매크로 패키지


kardianos/service의 포장.
Windows XP 이상, Linux(systemd | Upstart | SysV), OSX Launchd에 해당하는 Service의 Install, Unninstal, Start, Stop 패키지를 사용할 수 있습니다.

사용법


https://github.com/kardianos/service/tree/master/example
여기에 4가지 제작 예가 공개됐다.
나 자신도 좋은 샘플이 될 수 있는 것들을 써 보았지만, 결국은 ↑의 example 같은 것을 완성했다.
https://github.com/mako2kano/go_example_service/blob/master/main.go

Windows에 설치


↑의 고example_서비스가 윈도우즈 환경에서 goo build이면 goexample_service.할 줄 알다
admin으로 Powerrshell을 시작하고 "go example 서비스.exe install"를 치면 설치할 수 있습니다.
설치 후 Services를 시작하고 설치가 완료되었는지 확인합니다.

"go example 서비스.exe uninstall"에서 제거합니다.

Windows로 실행


"go example 서비스. exe start"라면 Start () 방법이 호출되어 행동을 시작합니다.
예를 들어 Start()에서 ↓의 Run()을 읽고 있기 때문에 1초에 한 번씩 로그를 출력합니다.
func (e *exarvice) Run() error {

    logger.Info("Exarvice Start !!!")

    ticker := time.NewTicker(1 * time.Second)
    for {
        select {
        case tm := <-ticker.C:
            logger.Infof("Still running at %v", tm)
        case <-e.exit:
            ticker.Stop()
            logger.Info("Exarvice Stop ...")
            return nil
        }
    }
}
start 상태에서 Event viewer를 보십시오. Windows Logis의 Application에 logger가 있습니다.Infof() 및 loggerinfo () 출력에 대한 메시지입니다.

"go example 서비스.exe stop"에서 중지합니다.

참조 페이지


goo에서 Windows 서비스 만들기
나는 처음부터 이 기사를 발견하고 시험해 보고 싶었지만 기사가 낡고 사용한 포장도 낡았고 사용법도 좀 달라서 기사를 썼다.

주의!!!


ticker가 5초가 되면 start가 안 돼요.
Error의 내용은 "Failed to start service. The service did not respond to the start or control request in a timely"로, 이런 현상은 설치 후 Start 서비스 시에만 나타난다.런()을 실행할 때 표시되지 않습니다.
이유를 전혀 몰라요. 동작을 다시 쓰고 확인하는 과정에서 ticker는 1초 후에 start를 할 수 있어요.
구체적으로 몇 초간 조사가 이뤄지지 않았지만, 서비스를 시작할 때 시간이 너무 길어지면 시간이 초과돼 무응답으로 판단됐다.

원인 링크?회피 전략(2018년 6월 14일 추기)


Service Control Manager 의 start timeout 은 3000ms 인 것 같습니다.
30초.
A timeout was reached (30000 milliseconds) while waiting for the Exarvice (Go Service Example) service to connect.
안 풀려.
왜냐하면 Go가 만든 프로그램이 start 전에 25초 이상 걸렸고, 그 후에 timer가 5초 이상 기다렸기 때문인가요?
회피 전략으로 regedit, HKEY- 시작LOCAL_MACHINE\SYSTEM\현재 Control의 Services Pipe Timeout 값을 30000에서 60000으로 변경하면 됩니다.
ServicesPipeTimeout 없이 제작
※ 해당 설치는 재가동 전까지 적용되지 않습니다.

좋은 웹페이지 즐겨찾기