Abgestürzten Dienst automatisch beenden und neu starten

Kategorie: Windows | Windows Server
Abgestürzten Dienst automatisch beenden und neu starten

Neulich hatte ich ein Problem mit einem Dienst, welcher von Zeit zu Zeit seine Tätigkeit eingestellt hat. Um das Problem zu beheben habe ich den Dienst automatisch 3 mal am Tag per Aufgabenplanung neu starten gelassen. Nun kam es aber vor, dass der Dienst beim Beenden hängen geblieben ist und im Status auf „Wird beendet“ verweilte. Damit dies nicht mehr passieren kann, habe ich mir ein Batchscript gebastelt, welches alle 5 Minuten prüft ob der Dienst abgestürzt ist. In diesem Artikel zeige ich euch meine Vorgehensweise um einen abgestürzten Dienst automatisch zu beenden und wieder neu zu starten.

Zunächst müsst ihr herausfinden wie der Dienst heißt. Dazu geht ihr in die Verwaltungskonsole für Dienste, sucht den Dienst der Probleme bereitet und geht per Rechtsklick auf Eigenschaften.

Eigenschaften von Windows Dienst Spooler

Dort findet ihr nun den Dienstnamen. In meinem Beispiel Spooler. Öffnet anschließend ein CMD Fenster mit Adminrechten und schaut euch den Status des Dienstes mit folgendem Befehl an:

sc queryex Spooler

Ausgabe von Dienststatus über CMD

Hier seht ihr unter anderem den Status und die PID. Mit diesen Informationen könnt ihr den Dienst nun entweder einmalig mittels Taskkill beenden oder das Ganze per Script automatisieren. In meinem Fall stand der Status dauerhaft auf STOP_PENDING, also zu deutsch „Wird beendet“. Er lies sich über die grafische Oberfläche nicht mehr beenden oder neu starten.

Abgestürzter Dienst im Status STOP_PENDING

Abgestürzten Dienst einmalig beenden

Sollte es sich um ein einmaliges Problem handeln, könnt ihr den Dienst einfach über CMD mit Adminrechten und folgendem Befehl beenden.

Taskkill /PID 3020 /F

Die entsprechende PID müsst ihr natürlich ersetzen. Sie ändert sich bei jedem Start des Dienstes. Mit dem Schalter /F wird das Beenden erzwungen.

Dienst im Status „Wird beendet“ automatisch neu starten per Script

Sollte ein Dienst öfter als einmal im Status „Wird beendet“ hängen bleiben, könnt ihr Taskkill mittels eines Batchscripts und der Windows Aufgabenplanung automatisch ausführen lassen. Ich verwende dazu folgendes Script:

set Status=NichtVohanden
for /f „tokens=4“ %%b in (’sc query DavidTLD002 ^|find „STATE „‚) do set Status=%%b
echo [Debug] Status: %Status%
if /i „%Status%“ == „STOP_PENDING“ (taskkill /F /IM tld.exe net start DavidTLD002)
if /i „%Status%“ == „STOPPED“ net start DavidTLD002
if /i „%Status%“ == „NichtVorhanden“ (
echo Da hat etwas nicht geklappt
)

Anpassen müsst ihr lediglich den Dienstnamen und die zugehörige EXE-Datei. Die EXE-Datei vom Dienst findet ihr ebenfalls bei den Diensten unter Rechtsklick – Eigenschaften.

Windows PowerShell 5 und PowerShell 7: Das Praxisbuch. Inkl. E-Book*
  • Schwichtenberg, Holger (Autor)
  • 1200 Seiten - 11.05.2020 (Veröffentlichungsdatum) - Carl Hanser Verlag GmbH & Co. KG (Herausgeber)

Letzte Aktualisierung am 5.12.2020 / Affiliate Links / Bilder von der Amazon Product Advertising API - Als Amazon-Partner verdiene ich an qualifizierten Käufen.

Das Script liest den Status des Dienstes aus und führt dann je nach Status verschiedene Bedingungen aus. In meinem Beispiel wird der Dienst im Status STOP_PENDING via Taskkill beendet und anschließend wieder gestartet. Ist der Status STOPPED, wird der Dienst einfach nur gestartet. Das Script könnt ihr für jede Art von Status anpassen und somit kinderleicht einen abgestürzten Dienst automatisch beenden und wieder neu starten.

Das fertige Script könnt ihr nun mit Hilfe der Aufgabenplanung automatisch in einem gewissen Intervall laufen lassen. Je nachdem wie kritisch der Dienst ist, umso kürzer sollte der Intervall sein. In meinem Fall habe ich das Script alle 5 Minuten laufen lassen.