Come posso riavviare automaticamente un servizio Windows in caso di arresto anomalo?


57

Ho un servizio Windows che esce inaspettatamente ogni pochi giorni. Esiste un modo semplice per monitorarlo per assicurarsi che venga riavviato rapidamente in caso di crash?

Risposte:


77

Nell'applicazione Servizi, selezionare le proprietà del servizio in questione.

Visualizza la scheda di ripristino - ci sono tutti i tipi di opzioni - Imposterei First & Second Failure per riavviare il servizio, Third per eseguire un programma batch che BLAT ha inviato un'email con la terza notifica di errore.

È inoltre necessario impostare il ripristino del conteggio errori su 1 per ripristinare quotidianamente il conteggio errori.

MODIFICARE:

Sembra che tu possa farlo tramite una riga di comando:

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

Il tuo file MyBatchFile.CMD può assomigliare a questo:

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

3
Tutte cose buone, ma +1 in particolare per i consigli di notifica via e-mail e le cose da riga di comando.
Maximus Minimus

Dove dovrebbe trovarsi il file batch sul disco?
Matt,

Dovunque. Con SC failure w3svc command= "MyBatchFile.cmd"esso dovrebbe essere nel percorso o C: \ Windows \ System32. Puoi inserirlo in qualsiasi directory se usi un percorso completo, ad es.SC failure w3svc command= "c:\Stuff\MyBatchFile.cmd"
Christopher_G_Lewis,

9

Aprire Services.msc, fare doppio clic sul servizio per aprire le Proprietà del servizio, è presente una scheda Ripristino e tali impostazioni dovrebbero consentire di riavviare il servizio in caso di errore.


4

Prova a impostare il tempo di recupero su zero:

inserisci qui la descrizione dell'immagine

L'equivalente della riga di comando:

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

Tuttavia, a volte il ripristino automatico non funziona correttamente e si consiglia di utilizzare software di terze parti. Sembra che il servizio esca con garbo con il codice di uscita di 0 finestre non tenti di recuperarlo.


1

Sto usando ServiceKeeper sul mio server Windows 2008 su HostForLife.eu e funziona molto bene. In precedenza, avevo una recensione su ServiceHawk, ma preferisco usare ServiceKeeper per la sua gestione e interfaccia più semplici.


1

Avevo un requisito simile per avviare un servizio se interrotto. La soluzione più semplice che ho pensato è stata quella di eseguire il comando seguente nell'utilità di pianificazione di Windows ogni 5 minuti:

net start MyServiceName

Questo comando avvia sostanzialmente il servizio (se interrotto) e non ha alcun effetto se il servizio è già in esecuzione.


1

Di recente ho implementato un'opzione di ripristino per eseguire uno script PowerShell che tenta di riavviare il servizio un numero definito di volte e invia una notifica e-mail alla conclusione, anche.

Dopo diversi tentativi (e nonostante tutte le altre cose che ho visto) La configurazione dei campi nella scheda di ripristino nei servizi è la seguente:

Programma: Powershell.exe
** Non C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Powershell.exe

Parametri della riga di comando: -command "& {SomePath \ YourScript.ps1 '$ args [0]' '$ args [1]' '$ args [n]'}"

ad esempio: -command "& {C: \ PowershellScripts \ ServicesRecovery.ps1 'Service Name'}"

** $ args sono parametri che verranno passati al tuo script. Questi non sono richiesti.

ecco lo script PowerShell:

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

Questa è stata la mia risposta su un thread simile Spero che questo aiuti ...

È possibile pianificare un semplice script vbs come questo per riavviare periodicamente il servizio sul computer, se necessario.

strComputer = "." 
strSvcName = "YOUR_SERVICE_NAME" 
set objWMI = GetObject ("winmgmts: \\" & strComputer & "\ root \ cimv2")
set objService = objWMI.Get ("Win32_Service.Name = '" & strSvcName & "'")
Se objService.State = "Stopped" Quindi
    objService.StartService ()
Finisci se



0

Qualcuno ha posto una domanda simile al Super User: è possibile installare uno strumento che monitora i servizi di Windows. Qualcosa come Service Hawk ti aiuterebbe a mantenere i servizi avviati o ti consentirebbe di pianificare i riavvii automatici (possibilmente durante la notte) per mantenere il servizio senza intoppi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.