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


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


46
2017-07-31 16:25


Ursprung




Antworten:


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

Sehen Sie sich die Wiederherstellungs-Registerkarte an - es gibt alle möglichen Optionen - Ich habe den ersten und zweiten Fehler gesetzt, um den Dienst neu zu starten, Drittens, um ein Batch-Programm zu starten BLATgibt eine E-Mail mit der dritten Fehlermeldung aus.

Sie sollten auch die Anzahl der fehlgeschlagenen Rücksetzungen auf 1 setzen, um die Anzahl der Fehlschläge täglich zurückzusetzen.

BEARBEITEN:

Sie können 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 wie folgt aussehen:

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

68
2017-07-31 16:30



Alle guten Sachen, aber +1 speziell für die E-Mail-Benachrichtigung und die Befehlszeile. - Maximus Minimus
Wo sollte die Batchdatei auf Festplatte gespeichert werden? - Matt
Irgendwo. Mit SC failure w3svc command= "MyBatchFile.cmd" Es sollte im Pfad oder C: \ Windows \ System32 sein. Sie können es in ein beliebiges Verzeichnis einfügen, wenn Sie einen vollständigen Pfad verwenden, z. SC failure w3svc command= "c:\Stuff\MyBatchFile.cmd" - Christopher_G_Lewis


Öffnen Sie Services.msc, doppelklicken Sie auf den Dienst, um die Eigenschaften des Dienstes zu öffnen, dort befindet sich die Registerkarte Wiederherstellung, und diese Einstellungen sollten es Ihnen ermöglichen, den Dienst bei einem Fehler neu zu starten.


8
2017-07-31 16:30





Das war meine Antwort auf eine ähnliche Faden Hoffe das hilft...

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

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



0
2017-07-31 16:29





Jemand hat eine ähnliche Frage bei Super User gestellt: Sie könnten ein Tool installieren, das Windows-Dienste überwacht. So etwas wie Service Falke würde Ihnen helfen, die Dienste am Laufen zu halten, oder Ihnen erlauben, automatische Neustarts zu planen (möglicherweise während der Nacht), um den Dienst reibungslos laufen zu lassen.


0
2017-10-12 01:10





ich benutze ServiceKeeper auf meinem Windows 2008 Server bei HostForLife.eu und es funktioniert sehr gut. Zuvor hatte ich eine Überprüfung von ServiceHawk, aber ich bevorzuge ServiceKeeper für seine einfachere Verwaltung und Schnittstelle.


0
2017-10-12 03:43





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

Starten Sie MyServiceName

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


0
2017-12-19 10:53





Ich habe vor kurzem eine Wiederherstellungsoption implementiert, um ein Powershell-Skript auszuführen, das versucht, den Dienst eine bestimmte Anzahl von Malen neu zu starten und eine E-Mail-Benachrichtigung an den Abschluss zu senden.

Nach mehreren Versuchen (und trotz all der anderen Dinge, die ich gesehen habe) Die Konfiguration von Feldern auf der Recovery-Registerkarte in Diensten ist 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]'}"

zB: -command "& {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
2018-02-08 21:50





Versuchen Sie, die Wiederherstellungszeit auf Null zu setzen:

enter image description here

Das Befehlszeilenäquivalent:

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

Trotzdem funktioniert die automatische Wiederherstellung manchmal nicht korrekt und es wurde empfohlen, Software von Drittanbietern zu verwenden. Es scheint, wenn Service beenden elegant mit dem Exit-Code von 0 Windows nicht versuchen, es wiederherzustellen.


0
2018-04-24 06:57