Announcement

Collapse
No announcement yet.

Dienst auf Remote Server beenden hängt

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Dienst auf Remote Server beenden hängt

    Moin,

    Ich bin nicht sicher, ob ihr da helfen könnt, aber ich vielleicht hat ja jemand Erfahrung damit und kann mir einen Tipp geben.

    Wir haben mehrere Server, auf denen unser ERP läuft. Hin und wieder müssen dabei die Dienste neu gestartet werden. Das muss in einer bestimmten Reihenfolge gemacht werden. Um sich nicht immer auf jedem Server einloggen zu müssen, habe ich ein kleines Tool für uns geschrieben, dass die Dienste in der korrekten Reihenfolge neu startet.

    Das funktioniert sehr gut!

    Nun haben wir ein Shopsystem, das zwar alle Dienste auf einem Server liegen hat, aber auch die müssen in einer bestimmten Reihenfolge beendet und wieder gestartet werden.
    Das habe ich ins Tool mit aufgenommen, und funktioniert grundsätzlich auch, mit der Ausnahme, dass zwei der vier Dienste beim Status wird beendet hängen bleiben.

    Ich mache das i.d.R. über die ServiceController Klasse ( Ausschnitt nur zum Verständnis ):
    Code:
    using (ServiceController sc = new ServiceController(service_model.Name, server))
    {
        if (sc.Status.Equals(ServiceControllerStatus.StartPending) || sc.Status.Equals(ServiceControllerStatus.Running))
        {
            SetServiceStartType(m, server, "disabled");
            sc.Stop();
        }
    
        sc.WaitForStatus(ServiceControllerStatus.Stopped, ServiceStatusWaitingTimeout);
    }
    Die Methode SetServiceStartType setzt über das sc Kommando per CommandLine den StarTyp zunächst auf disabled. Das habe ich gemacht, weil mir der ServiceController die Möglichkeit dieser Anpassung nicht ohne weiteres zur Verfügung stellt.
    Die Variable ServiceStatusWaitingTimeout ist ein TimeSpan, mit dem ich nach aktuell 15sek. das Warten abbreche und den Task-Ablauf fortführe. Ohne diesen TimeSpan, hängt das Tool natürlich, weil der Dienst nie in den Status beendet wechselt.

    Auf dem entsprechenden Server liegt eine Batch, die exakt dasselbe macht: Startyp auf disabled per sc.exe und beenden des Dienstes, allerdings mit net stop.
    Das funktioniert einwandfrei, aber über mein Tool von extern bleibt er bei zwei Diensten beim Beenden hängen. Disable wird gesetzt, aber dann gehen die beiden Dienste nur in wird beendet und nichts passiert weiter.

    Ich habe auch statt dem ServiceController schon versucht, die Konsole zu verwenden:
    Code:
    Process p = new Process()
    {
        StartInfo = new ProcessStartInfo
        {
            FileName = Environment.GetFolderPath(Environment.SpecialFolder.System) + @"\sc.exe"
            , Arguments = $@"\\{server} stop ""{svc.Name}"""
            , UseShellExecute = false
            , CreateNoWindow = true
        }
    };
    
    p.Start();
    p.WaitForExit();
    aber das führt zum selben Verhalten.


    Meine Frage dazu:
    Gibt es etwas zu beachten, das ich bisher übersehen habe? Oder gibt es eine Möglichkeit, das Beenden zu forcieren?
    Lokal funktioniert es ja, remote halt nur bei zwei von insgesamt 9 Diensten nicht. Also grundsätzlich kann es ja nicht falsch sein


    Danke für Kommentare und Meinungen
    PHP rocks!
    Eine Initiative der PHP Community

  • #2
    Wenn es deinen eigenen selbstgeschriebene Services sind kannst du versuchen die mit Logging so zu ergänzen das die dir möglicherweise erzählen warum sie sich nicht beenden wollen.

    Wobei man sagen muss "beenden" ist eine Aufforderungen an den Service sich selbst zu beenden und das melden des Status ist auch eine Aufgabe des Dienstes das zu melden.
    Heißt beides kann aus vielen Gründen schief gehen und selbst der Status kann gelogen sein. Im Zweifel bleibt abschießen des Prozesses, wenn der Service für dich ansonsten eine BlackBox ist übrig, mit den entsprechenden Restrisiken.

    Z.b wenn du schon eine Process Instanz am Wickel hast per deren Kill() Methode oder per Commandline
    Code:
    taskkill /S myLovelyServerName /F /FI "SERVICES eq MyLovelyServiceName"

    Comment


    • #3
      Hi Ralf,

      Danke für Deine Antwort!

      Die Services sind nicht meine, also im Prinzip BlackBox. Aber ich kenne die zugehörigen Prozesse dahinter und könnte die natürlich nach dem TimeSpan mal killen. Den TimeSpan lasse ich ihm, um wenigstens den Versuch des sauber beenden zu ermöglichen

      Aber das könnte evtl. schon helfen. Habe ich noch nicht dran gedacht.
      Muss ich mir aber morgen früh anschauen.

      Danke Dir!
      PHP rocks!
      Eine Initiative der PHP Community

      Comment


      • #4
        Astrein, so funktioniert es wunderbar, danke!
        Ich hatte zwar auf dem Plan, um taskkill zu erweitern, aber dazu extra die abhängigen Prozesse zu den Services rausgesucht, Den Filter SERVICES habe ich glatt übersehen.
        Das macht es einfacher...
        PHP rocks!
        Eine Initiative der PHP Community

        Comment

        Working...
        X