@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". Вы должны заменить выполнение кода службы на свой собственный код.
Примечание: Для компиляции и запуска службы вам может потребоваться использовать учетные данные администратора.
@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.