2016-02-24 6 views
6

Ich habe eine Anwendung mit Golang als Backend. kann ich einen Dienst mit dem sc und NSSM wie unten erstellen: sc create TestService binpath=C:\User\sds\Desktop\test.exe nssm install TestService C:\User\sds\Desktop\test.exeKann nicht starten golang application exe als Windows-Dienste

Die Dienste werden erfolgreich erstellt, aber es doesn nicht loszulegen. Es gibt Startup-Timeout-Fehler beim Starten des Dienstes.

Ich muss die Anwendung von Windows-Diensten starten.

Vielen Dank im Voraus.

+0

Zusätzlich zu der Antwort der @ GKV: Sie müssen verstehen, dass ein Windows-Dienst ein kompliziertes Tier ist, die eine Menge Verarbeitung einmal gestartet (und darüber hinaus jede ausführbare Datei in besonderer Weise aufgerufen werden sollte und tun tiehing - sei es eine EXE oder eine DLL - könnte eine beliebige Anzahl von Windows-Diensten hosten, und viele vom Betriebssystem bereitgestellte Dienste werden so ausgeführt.) – kostix

+0

Eine Low-Tech-Lösung würde Ihre Anwendung über 'srvany' oder' nssm' verpacken (google sie, wenn Sie möchten) - die im Grunde eine normale (normale) Windows-Anwendung in einen Windows-Dienst verwandeln. Ich würde immer noch dem Rat des @ GKV folgen. – kostix

+0

@kostix Ich habe bereits versucht, mit nssm, aber das Ergebnis ist das gleiche. Ich bekomme den gleichen 1053 Fehler. –

Antwort

8

Go verfügt über eine Bibliothek zum Erstellen von Diensten in Windows. Bitte überprüfen Sie diese Bibliothek github.com/kardianos/service.

package main 

import (
    "log" 

    "github.com/kardianos/service" 
) 

var logger service.Logger 

type program struct{} 

func (p *program) Start(s service.Service) error { 
    // Start should not block. Do the actual work async. 
    go p.run() 
    return nil 
} 
func (p *program) run() { 
    // Do work here 
} 
func (p *program) Stop(s service.Service) error { 
    // Stop should not block. Return with a few seconds. 
    return nil 
} 

func main() { 
    svcConfig := &service.Config{ 
     Name:  "GoServiceExampleSimple", 
     DisplayName: "Go Service Example", 
     Description: "This is an example Go service.", 
    } 

    prg := &program{} 
    s, err := service.New(prg, svcConfig) 
    if err != nil { 
     log.Fatal(err) 
    } 
    logger, err = s.Logger(nil) 
    if err != nil { 
     log.Fatal(err) 
    } 
    err = s.Run() 
    if err != nil { 
     logger.Error(err) 
    } 
} 
+0

Vielen Dank für die Beantwortung der Frage. Ich habe gelesen über das Paket [Kardianos/Service] (https://github.com/kardianos/service) "und ein ähnliches Paket auch" [svc] (https://godoc.org/golang.org/x/sys/windows/svc) ". Aber mein Zweifel ist, dass" Was wird der Code fließen, da ich die exe in meinem Installer bündeln muss? Muss ich die exe starten und dann einen Service für die gleiche exe ?? ". –

+0

Sie sollten den oben genannten Code (in Ihrem main.go) behalten, wenn Sie die .exe installieren, mit Installer wird es automatisch Ihren Dienst starten . – GKV