web-dev-qa-db-fra.com

Comment redémarrer automatiquement un service Windows s'il se bloque?

J'ai un service Windows qui se ferme de manière inattendue tous les quelques jours. Existe-t-il un moyen simple de le surveiller pour vous assurer qu'il redémarre rapidement s'il se bloque?

57
Liam

Sous l'application Services, sélectionnez les propriétés du service en question.

Afficher l'onglet de récupération - il existe toutes sortes d'options - Je définirais le premier et le deuxième échec de redémarrage du service, le troisième pour exécuter un programme de commandes qui BLAT envoie un e-mail avec la troisième notification d'échec.

Vous devez également définir le nombre d'échecs de réinitialisation sur 1 pour réinitialiser le nombre d'échecs quotidiennement.

MODIFIER:

On dirait que vous pouvez le faire via une ligne de commande:

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

Votre fichier MyBatchFile.CMD peut ressembler à ceci:

blat - -body "Service W3svc Failed" -subject "SERVICE ERROR" -to [email protected] -server SMTP.Example.com -f [email protected]
79
Christopher_G_Lewis

Ouvrez Services.msc, double-cliquez sur le service pour ouvrir les propriétés du service, il y a un onglet Récupération et ces paramètres devraient vous permettre de redémarrer le service en cas d'échec.

9
jeremyasnyder

Essayez de régler le temps de récupération à zéro:

enter image description here

L'équivalent en ligne de commande:

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

Quoi qu'il en soit, la récupération automatique ne fonctionne pas toujours correctement et il est recommandé d'utiliser un logiciel tiers. Il semble que lorsque le service se termine correctement avec le code de sortie de 0 Windows, n'essayez pas de le récupérer.

4
MSS

J'avais une exigence similaire pour démarrer un service si arrêté. La solution la plus simple que je pensais était d'exécuter la commande ci-dessous dans le planificateur de tâches Windows toutes les 5 minutes:

net start MyServiceName

Cette commande démarrera essentiellement le service (si elle est arrêtée) et n'a aucun effet si le service est déjà en cours d'exécution.

1
Anderson

J'utilise ServiceKeeper sur mon serveur Windows 2008 sur HostForLife.eu et cela fonctionne très bien. Auparavant, j'avais un avis sur ServiceHawk, mais je préfère utiliser ServiceKeeper pour sa gestion et son interface plus faciles.

1
Play_Park

J'ai récemment implémenté une option de récupération pour exécuter un script PowerShell qui tente de redémarrer le service un nombre défini de fois et envoie une notification par e-mail à la fin, également.

Après plusieurs tentatives (et malgré toutes les autres choses que j'ai vues) La configuration des champs sur l'onglet de récupération dans les services est la suivante:

Programme: Powershell.exe
** Pas C:\Windows\System32\WindowsPowerShell\v1.0\Powershell.exe

Paramètres de ligne de commande: -command "& {SomePath\YourScript.ps1 '$ args [0]' '$ args [1]' '$ args [n]'}"

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

** Les $ args sont des paramètres qui seront transmis à votre script. Ce ne sont pas obligatoires.

voici le 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

Quelqu'un a posé une question similaire sur Super User: vous pouvez installer un outil qui surveille les services Windows. Quelque chose comme Service Hawk vous aiderait à maintenir les services démarrés, ou vous permettrait de planifier des redémarrages automatiques (éventuellement pendant la nuit) pour assurer le bon fonctionnement du service.

0
ExtraLean

Ce fut ma réponse sur un similaire fil J'espère que cela aide ...

Vous pouvez planifier un script vbs simple comme celui-ci pour redémarrer périodiquement le service sur l'ordinateur si nécessaire.

 strComputer = "." 
 strSvcName = "YOUR_SERVICE_NAME" 
 set objWMI = GetObject ("winmgmts: \\" & strComputer & "\ root\cimv2") 
 set objService = objWMI.Get ("Win32_Service .Name = '"& strSvcName &"' ") 
 Si objService.State =" Arrêté "Alors 
 ObjService.StartService () 
 Fin Si 


0
Maxwell