Как создать службу windows на golang?

Пользователь

от ian.heidenreich , в категории: Golang , год назад

Как создать службу windows на golang?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от clement.erdman , год назад

@ian.heidenreich 

Для создания службы Windows на Go вы можете использовать стороннюю библиотеку golang.org/x/sys/windows/svc. Вот пример кода:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package main

import (
	"fmt"
	"golang.org/x/sys/windows/svc"
	"golang.org/x/sys/windows/svc/mgr"
	"log"
)

const serviceName = "MyService"

type myService struct{}

func (s *myService) Execute(args []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (ssec bool, errno uint32) {
	changes <- svc.Status{State: svc.Running, Accepts: svc.AcceptStop | svc.AcceptShutdown}

	// Выполнение кода службы

	<-r
	changes <- svc.Status{State: svc.StopPending}

	return
}

func main() {
	isIntSess, err := svc.IsAnInteractiveSession()
	if err != nil {
		log.Fatalf("failed to determine if we are running in an interactive session: %v", err)
	}

	if isIntSess {
		fmt.Println("This program should be run as a service, not from the command line.")
		return
	}

	cfg := mgr.Config{
		DisplayName:  "My Service",
		StartType:    mgr.StartAutomatic,
		ServiceStart: serviceStart,
	}

	m, err := mgr.Connect()
	if err != nil {
		log.Fatalf("failed to connect to the service manager: %v", err)
	}
	defer m.Disconnect()

	s, err := m.OpenService(serviceName)
	if err == nil {
		defer s.Close()

		err = s.Delete()
		if err != nil {
			log.Fatalf("failed to delete existing service: %v", err)
		}

		fmt.Printf("Existing service %s successfully deleted.
", serviceName)
	}

	s, err = m.CreateService(serviceName, os.Args[0], cfg, "is", "auto-started service")
	if err != nil {
		log.Fatalf("failed to create service: %v", err)
	}

	defer s.Close()

	err = s.Start()
	if err != nil {
		log.Fatalf("failed to start service: %v", err)
	}

	fmt.Printf("Service %s successfully installed and started.
", serviceName)
}

func serviceStart(name string) (svc.Specifics, error) {
	return &myService{}, nil
}


В приведенном выше примере создается служба Windows с именем "MyService". Вы должны заменить выполнение кода службы на свой собственный код.


Примечание: Для компиляции и запуска службы вам может потребоваться использовать учетные данные администратора.

Пользователь

от autumn_parker , 6 месяцев назад

@ian.heidenreich 

Приведенный пример кода на Go демонстрирует создание службы Windows с использованием библиотеки golang.org/x/sys/windows/svc. В этом коде определен тип myService, который реализует метод Execute, обрабатывающий выполнение службы.


Для запуска данного кода в качестве службы Windows вам также потребуется скомпилировать исполняемый файл и зарегистрировать его как службу.


Чтобы скомпилировать код, используйте команду:

1
go build -o MyService.exe


Чтобы зарегистрировать службу, откройте командную строку от имени администратора и запустите следующую команду, указав путь к скомпилированному исполняемому файлу:

1
sc create MyService binPath= "<путь к исполняемому файлу>"


Далее запустите службу с помощью команды:

1
sc start MyService


Пожалуйста, помните, что для работы со службами Windows вам может потребоваться права администратора. Предварительно проверьте и убедитесь, что ваш код соответствует требованиям безопасности и надлежащим практикам программирования служб в Windows.