Wie kann ich einen Windows-Dienst automatisch neu starten, wenn er abstürzt?


57

Ich habe einen Windows-Dienst, der alle paar Tage unerwartet beendet wird. Gibt es eine einfache Möglichkeit, es zu überwachen, um sicherzustellen, dass es bei einem Absturz schnell neu gestartet wird?

Antworten:


77

Wählen Sie unter der Anwendung "Dienste" die Eigenschaften des betreffenden Dienstes aus.

Anzeigen des Wiederherstellungsregisters - es gibt alle möglichen Optionen - Ich habe First & Second Failure (Erster und Zweiter Fehler) auf Restart the Service (Neustart des Dienstes) und Third (Dritter Fehler) eingestellt, um ein Stapelverarbeitungsprogramm auszuführen , mit dem BLAT eine E-Mail mit der dritten Fehlerbenachrichtigung versendet .

Sie sollten auch den Reset Fail Count auf 1 setzen, um den Fail Count täglich zurückzusetzen.

BEARBEITEN:

Sieht so aus, als könnten Sie dies über eine Befehlszeile tun:

SC failure w3svc reset= 432000  actions= restart/30000/restart/60000/run/60000
SC failure w3svc command= "MyBatchFile.cmd"

Ihre MyBatchFile.CMD-Datei kann folgendermaßen aussehen:

blat - -body "Service W3svc Failed" -subject "SERVICE ERROR" -to Notify@Example.com -server SMTP.Example.com -f Administrator@Example.com

3
Alles gute Sachen, aber +1 vor allem für die E-Mail-Benachrichtigung und das Kommandozeilen-Zeug.
Maximus Minimus

Wo soll sich die Batch-Datei auf der Festplatte befinden?
Matt

Irgendwo. Mit SC failure w3svc command= "MyBatchFile.cmd"sollte es im Pfad oder C: \ Windows \ System32 sein. Sie können es in ein beliebiges Verzeichnis stellen, wenn Sie einen vollständigen Pfad verwenden, z. B.SC failure w3svc command= "c:\Stuff\MyBatchFile.cmd"
Christopher_G_Lewis

9

Öffnen Sie "Services.msc", doppelklicken Sie auf den Dienst, um die Eigenschaften des Dienstes zu öffnen. Es gibt eine Registerkarte "Wiederherstellung". Mit diesen Einstellungen sollten Sie den Dienst bei einem Fehler neu starten können.


4

Versuchen Sie, die Erholungszeit auf Null zu setzen:

Bildbeschreibung hier eingeben

Das Befehlszeilenäquivalent:

SC failure YOUR_SERVICE_NAME reset= 0 actions= restart/0/restart/0/restart/0

Auf jeden Fall funktioniert die automatische Wiederherstellung manchmal nicht richtig und es wird empfohlen, Software von Drittanbietern zu verwenden. Es scheint, als würde ein ordnungsgemäßer Service-Exit mit einem Exit-Code von 0 Fenstern nicht versuchen, ihn wiederherzustellen.


1

Ich verwende ServiceKeeper auf meinem Windows 2008-Server bei HostForLife.eu und es funktioniert sehr gut. Zuvor hatte ich eine Überprüfung von ServiceHawk, bevorzuge jedoch die Verwendung von ServiceKeeper, um die Verwaltung und die Benutzeroberfläche zu vereinfachen.


1

Ich hatte eine ähnliche Anforderung, einen Dienst zu starten, wenn er gestoppt wurde. Die einfachste Lösung, die ich dachte, war, den folgenden Befehl alle 5 Minuten im Windows-Taskplaner auszuführen:

net start MyServiceName

Dieser Befehl startet den Dienst im Grunde (wenn er gestoppt ist) und hat keine Auswirkung, wenn der Dienst bereits ausgeführt wird.


1

Ich habe kürzlich eine Wiederherstellungsoption implementiert, um ein Powershell-Skript auszuführen, das versucht, den Dienst eine definierte Anzahl von Malen neu zu starten und zum Abschluss eine E-Mail-Benachrichtigung sendet.

Nach mehreren Versuchen (und trotz all der anderen Dinge, die ich gesehen habe) ist die Konfiguration der Felder auf der Registerkarte Wiederherstellung in Diensten wie folgt:

Programm: Powershell.exe
** Nicht C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Powershell.exe

Befehlszeilenparameter: -command "& {SomePath \ YourScript.ps1 '$ args [0]' '$ args [1]' '$ args [n]'}"

Beispiel: -Befehl "& {C: \ PowershellScripts \ ServicesRecovery.ps1 'Dienstname'}"

** Die $ args sind Parameter, die an Ihr Skript übergeben werden. Diese sind nicht erforderlich.

Hier ist das Powershell-Skript:

cd $PSScriptRoot

$n = $args[0]

function CreateLogFile {
$events = Get-EventLog -LogName Application -Source SomeSource -Newest 40
if (!(Test-Path "c:\temp")) {
    New-Item -Path "c:\temp" -Type directory}
if (!(Test-Path "c:\temp\ServicesLogs.txt")) {
    New-Item -Path "c:\temp" -Type File -Name "ServicesLogs.txt"}
    $events | Out-File -width 600 c:\temp\ServicesLogs.txt
}

function SendEmail  {
$EmailServer = "SMTP Server"
$ToAddress = "Name@domain.com"
$FromAddress = "Name@domain.com"

CreateLogFile

$Retrycount = $Retrycount + 1
send-mailmessage -SmtpServer $EmailServer -Priority High -To $ToAddress -From $FromAddress -Subject "$n Service failure" `
-Body "The $n service on server $env:COMPUTERNAME has stopped and was unable to be restarted after $Retrycount attempts." -Attachments c:\temp\ServicesLogs.txt

Remove-Item "c:\temp\ServicesLogs.txt"
}

function SendEmailFail  {
$EmailServer = "SMTP Server"
$ToAddress = "Name@domain.com"
$FromAddress = "Name@domain.com"

CreateLogFile

$Retrycount = $Retrycount + 1
send-mailmessage -SmtpServer $EmailServer -Priority High -To $ToAddress -From $FromAddress -Subject "$n Service Restarted" `
-Body "The $n service on server $env:COMPUTERNAME stopped and was successfully restarted after $Retrycount attempts. The relevant system logs are attached." -Attachments c:\temp\ServicesLogs.txt

Remove-Item "c:\temp\ServicesLogs.txt"
}

function StartService {

$Stoploop = $false

do {
   if ($Retrycount -gt 3){
     $Stoploop = $true
     SendEmail
     Break
    }

   $i =  Get-WmiObject win32_service | ?{$_.Name -imatch $n} | select Name, State, StartMode
    if ($i.State -ne "Running" -and $i.StartMode -ne "Disabled") {

        sc.exe start $n
        Start-Sleep -Seconds 35

        $i =  Get-WmiObject win32_service | ?{$_.Name -imatch $n} | select State
          if ($i.state -eq "Running"){
              $Stoploop = $true
              SendEmailFail}
          else {$Retrycount = $Retrycount + 1}
    }        
}
While ($Stoploop -eq $false)
}

[int]$Retrycount = "0"
StartService

0

Dies war meine Antwort auf einen ähnlichen Thread Hoffe, das hilft ...

Sie können ein einfaches vbs-Skript wie dieses planen, um den Dienst auf dem Computer bei Bedarf regelmäßig neu zu starten.

strComputer = "." 
strSvcName = "YOUR_SERVICE_NAME" 
set objWMI = GetObject ("winmgmts: \\" & strComputer & "\ root \ cimv2")
set objService = objWMI.Get ("Win32_Service.Name = '" & strSvcName & "'")
If objService.State = "Gestoppt" Dann
    objService.StartService ()
End If



0

Bei Super User stellte jemand eine ähnliche Frage: Sie könnten ein Tool installieren, das Windows-Dienste überwacht. So etwas wie Service Hawk würde Ihnen helfen, die Dienste am Laufen zu halten, oder es Ihnen ermöglichen, automatische Neustarts (möglicherweise während der Nacht) zu planen, damit der Dienst reibungslos läuft.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.