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 ):
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:
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
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 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();
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
Comment