Flash info

"Si vous vivez chaque jour comme si c'était le dernier, un jour vous aurez probablement raison."

Steve Jobs (1955-2011)

 
Accueil arrow Bibliothèque de scripts arrow Services Windows arrow Surveillance d'un service et relancement automatique en cas d'arrêt
Surveillance d'un service et relancement automatique en cas d'arrêt
Écrit par Arnaud Petitjean [MVP]   
23-02-2011

Un utilisateur du forum (voir le fil de discussions) a eu ces derniers jours un problème à résoudre lié à l'arrêt inopiné d'un service. En effet, son applicatif métier est boggué à mourir Wink et comme il tourne en tant que service il devient critique de surveiller ce dernier et de le redémarrer le plus rapidement possible lorsqu'il s'arrête.

Voici ma solution (remarquez que je n'ai pas dit LA solution) - basée sur la souscription à un évènement WMI - pour redémarrer un service automatiquement lorsque celui-ci s'arrête. Cette solution a l'avantage de déléguer au système la surveillance; ainsi cela ne consomme quasiment pas de ressource CPU; en tout cas beaucoup moins qu'une "vilaine" boucle infinie...

Voici le code :

$serviceName = 'Audiosrv'
$query = "Select * From __InstanceOperationEvent
          within 3
          Where TargetInstance ISA 'Win32_service'
          AND TargetInstance.Name='$serviceName'"
$action =
{
    if ( (Get-Service $serviceName).Status -ne 'running' )
    {
        Write-Warning "Démarrage du service $serviceName"
        Start-Service $serviceName
    }
}
Register-WMIEvent -query $query -sourceIdentifier "ArretService" –action $action

J'ai fait un test sur mon Windows Server 2008 R2 avec le service AudioSrv et ça fonctionne parfaitement bien.
Lorsque j'arrête le service, celui-ci est détecté dans les 3 secondes par WMI et exécute le bloc de code PowerShell présent dans $action.

Vous n'avez plus qu'à modifier le contenu de la variable $serviceName pour avec le nom de votre service à surveiller et le tour sera joué.

Exemple : Arrêt du service audiosrv et redémarrage automatique de celui-ci


PS > Stop-Service -name audiosrv

... quelques secondes s'écoulent, puis le service redémarre...

PS > AVERTISSEMENT : Démarrage du service Audiosrv

PS > Get-Service -name audiosrv
Status   Name               DisplayName
------   ----               -----------
Running  audiosrv           Windows Audio

Ce script est à exécuter au démarrage d'un serveur ; l'idéal est de le faire démarrer par une tâche planifiée .

La commandelette Register-WMIEvent crée un job (travail en arrière plan).

Pour visualiser les jobs en cours d'exécution d'un système, utilisez la commande Get-Job.

Exemple :


PS C:\> get-job

Id              Name            State      HasMoreData     Location             Command
--              ----            -----      -----------     --------             -------
6               ArretService    Running    True                                 ...
      

Pour arrêter le job :


PS C:\> Get-Job -id 6 | Remove-Job -Force
      

Dernière mise à jour : ( 23-02-2011 )
 
© 2017 PowerShell-Scripting.com