sviluppo-web-qa.it

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

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?

57
Liam

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

Visualizza la scheda di ripristino - ci sono tutti i tipi di opzioni - Impostarei Primo e Secondo errore per riavviare il servizio, Terzo per eseguire un programma batch che BLAT esce un'email con la terza notifica di errore.

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

EDIT:

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 [email protected] -server SMTP.Example.com -f [email protected]
79

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.

9
jeremyasnyder

Prova a impostare il tempo di recupero su zero:

enter image description here

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.

4
MSS

Avevo requisiti simili 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
Anderson

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

1
Play_Park

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 = "[email protected]"
$FromAddress = "[email protected]"

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 = "[email protected]"
$FromAddress = "[email protected]"

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
1
Nick

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

0
ExtraLean

Questa è stata la mia risposta su un simile thread 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 () 
 End If 


0
Maxwell