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

57

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 s’assurer qu’il redémarre rapidement en cas de plantage?

Liam
la source

Réponses:

77

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

Affichez l'onglet de récupération - il y a toutes sortes d'options - je configurerais Première et deuxième échecs pour redémarrer le service, Troisième pour exécuter un programme de traitement par lots qui BLAT envoie un courrier électronique 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 chaque jour.

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]
Christopher_G_Lewis
la source
3
Toutes les bonnes choses, mais +1 en particulier pour les avis de notification par courrier électronique et les commandes en ligne de commande.
Maximus Minimus
Où le fichier de commandes doit-il vivre sur le disque?
Matt
Nulle part. Avec SC failure w3svc command= "MyBatchFile.cmd"cela devrait être dans le chemin ou C: \ Windows \ System32. Vous pouvez le mettre dans n'importe quel répertoire si vous utilisez un chemin complet, c'estSC failure w3svc command= "c:\Stuff\MyBatchFile.cmd"
Christopher_G_Lewis
9

Ouvrez Services.msc, double-cliquez sur le service pour ouvrir les propriétés du service. Il existe un onglet Récupération. Ces paramètres devraient vous permettre de redémarrer le service en cas d’échec.

Jeremyasnyder
la source
4

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

entrez la description de l'image ici

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 parfois pas correctement et il est recommandé d'utiliser un logiciel tiers. Il semble que lorsque le service quitte normalement le code de sortie de 0, Windows ne tente pas de le récupérer.

MSS
la source
1

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


la source
1

J'ai eu la même exigence de démarrer un service si arrêté. La solution la plus simple à laquelle 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 le service (si elle est arrêtée) et n'a aucun effet si le service est déjà en cours d'exécution.

Anderson
la source
1

J'ai récemment mis en œuvre 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 courrier électronique à la conclusion.

Après plusieurs tentatives (et malgré tout ce que j'ai vu), la configuration des champs de 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 'Nom du service'}"

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

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
pseudo
la source
0

Ce fut ma réponse sur un fil similaire 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


Maxwell
la source
0

Quelqu'un a posé une question similaire chez le super utilisateur: Vous pourriez installer un outil qui surveille les services Windows. Quelque chose comme Service Hawk pourrait vous aider à garder les services démarrés ou vous permettre de planifier des redémarrages automatiques (éventuellement pendant la nuit) pour que le service continue de fonctionner correctement.


la source