Eigener Dienst startet nicht aus Code heraus

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von michivandersar.

    Eigener Dienst startet nicht aus Code heraus

    Hallo zusammen

    Ich stecke gerade bei einem seltsamen Problem
    fest. Ich habe einen eigenen Service programmiert. Dieser funktioniert
    problemlos. Starten und Beenden über die Kommandozeile und über die MMC
    funktioniert fehlerfrei, jedoch kann ich mittels dem Konfigurationstool den Dienst nicht neu starten.

    Dies ist der Code der den Dienst neustarten sollte.

    VB.NET-Quellcode

    1. Private Sub btnRestart_Click(sender As System.Object, e As System.EventArgs) Handles btnRestart.Click
    2. Dim sc As ServiceController
    3. Try
    4. sc = New ServiceController("Projektordner Server Service")
    5. If sc.Status <> ServiceControllerStatus.Stopped And sc.Status <> ServiceControllerStatus.StopPending Then
    6. sc.Stop()
    7. End If
    8. sc.WaitForStatus(ServiceControllerStatus.Stopped)
    9. sc.Start()
    10. sc.WaitForStatus(ServiceControllerStatus.Running)
    11. MessageBox.Show("Dienst wurde neu gestartet")
    12. Catch ex As Exception
    13. MessageBox.Show(ex.ToString)
    14. End Try
    15. End Sub

    Hin
    und wieder funktioniert es, jedoch bleibt er meistens in der Zeile
    sc.WaitForStatus(ServiceControllerStatus.Running)
    hängen, bis ich den Dienst mittels MMC oder Kommandozeile manuel gestartet habe.

    Vielen Dank für die Hilfe bereits im Voraus ;)
    Ich bin lokaler Admin und die UAC ist deaktiviert. Aber auch wenn ich die EXE als Administrator ausführe, bleibt er hängen.

    Ich habe mal versucht, währenddessen der Code hängt, den Dienst über die Konsole zu starten. Folgendes Ergebnis:

    1. Versuch:
    net start "Projektordner Server Service"
    Projektordner Server Service wird gestartet.
    Projektordner Server Service konnte nicht gestartet werden.

    Ein Systemfehler ist aufgetreten.

    Systemfehler 1067 aufgetreten.

    Der Prozess wurde unerwartet beendet.

    Passiert nichts.

    2. Versuch:
    net start "Projektordner Server Service"
    Projektordner Server Service wird gestartet.
    Projektordner Server Service konnte nicht gestartet werden.

    Ein Systemfehler ist aufgetreten.

    Systemfehler 1067 aufgetreten.

    Der Prozess wurde unerwartet beendet.
    Hier kommt dann vom Programm die Meldung, dass der Dienst neu gestartet wurde.


    3. Versuch:
    net start "Projektordner Server Service"
    Projektordner Server Service wird gestartet.
    Projektordner Server Service konnte nicht gestartet werden.

    Ein Systemfehler ist aufgetreten.

    Systemfehler 1067 aufgetreten.

    Der Prozess wurde unerwartet beendet.
    Hier passiert dann wieder nichts.


    Versuch 4:
    net start "Projektordner Server Service"
    Projektordner Server Service wird gestartet.
    Projektordner Server Service wurde erfolgreich gestartet.
    Jetzt läuft der Dienst.
    Ich würde mal darauf tippen, dass die Startart egal ist (NET START oder per Programm), sondern dass der Dienst an sich ein Problem hat und nur manchmal sauber hochkommt.
    Vielleicht Netzwerk-Timeout oder sowas.

    Der Service-Start darf nicht länger als 30s benötigen.
    Wenn du für die Initialisierung länger benötigst, starte von dort einen eigenen Thread.

    Ich würde in den Dienst Trace-Funktionen einbauen, damit du weißt wo er abstürzt.
    Exception abfangen und Exception.StackTrace in eine Datei schreiben.

    Wenn ich einen Windows-Service entwickle, mach ich das immer so, dass ich den fraglichen Code in eine eigene Klasse packe, die ich wahlweise vom Service-Handler und von einer Konsolanwendung instantiieren kann.
    Das erleichtert das Debuggen erheblich.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Wenn Du Deinen Dienst debuggen willst, mach Dir mit denselben Quellen ein kleines GUI-Projekt mit Start- und Stop-Button und einer Ausgabe und behandle das ganze dann als normales Programm.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Da fällt mir noch ein:
    Auch wenn du den Dienst mit GUI oder Console debuggst, darfst du natürlich keine GUI-Controls oder Console-Funktionen (z.B. Console.Writeline) ansprechen, da diese im Service-Betrieb natürlich nicht vorhanden sind.

    Also den Rahmen nur für Start- und Stopp-Mechanismen verwenden.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @petaod:
    Mein Start sieht jetzt so aus:

    VB.NET-Quellcode

    1. Protected Overrides Sub OnStart(ByVal args() As String)
    2. Try
    3. Settings.getSettingsFromXML()
    4. orderType = orderTypes.other
    5. _thread = New Thread(New ThreadStart(AddressOf listen))
    6. _thread.Start()
    7. _console = New Thread(New ThreadStart(AddressOf com_console))
    8. _console.Start()
    9. Catch ex As Exception
    10. My.Computer.FileSystem.WriteAllText("C:\serverlog.txt", ex.StackTrace, False)
    11. Throw ex
    12. End Try
    13. End Sub
    14. Private Sub com_console()
    15. Try
    16. 'code
    17. Catch tax As ThreadAbortException
    18. diag.close()
    19. Catch ex As Exception
    20. Throw ex
    21. End Try
    22. End Sub
    23. Private Sub listen()
    24. Try
    25. 'Code
    26. Catch tax As ThreadAbortException
    27. server.Shutdown(SocketShutdown.Both)
    28. server.Close()
    29. Catch ex As Exception
    30. Throw ex
    31. End Try
    32. End Sub

    Allerdings wird mir keine Datei geschrieben? und die 30sekunden sollten ausreichen, oder ;)

    Bevor es zum Dienst wurde, war es eine Konsolenanwendung, um zu testen. Die Konsolenausgaben sind draussen und GUI Elemente hatte ich nie.

    @RodFromGermany:
    Wie gesagt, zuerst war es eine Konsolenanwendung und die Main() ist jetzt die onStart().
    Danke =D

    Ich habe jetzt eine Fehlermeldung erhalten. Offenbar hatte ich beim Beenden ein Socket nicht richtig geschlossen, sodass der Dienst erst wieder starten konnte, nachdem Windows oder das Framework diesen geschlossen hatte.

    Ich habe mich nochmals in die Geschichte mit der Netzwerkkommunikation gelesen, einige Subs und Funktionen neu geschrieben und nun funktionierts.

    Vielen Dank für eure Hilfen =D