Passer au contenu

Vérifier qu’un service Windows est en cours d’exécution

Un court script PowerShell par service : en cours d’exécution, il est en bon état ; arrêté, c’est un problème ; bloqué au démarrage, c’est un avertissement.

Vérifications que vous ajouterez
Script (agent)
L’agent
Requiert l’agent
Écrit pour
Windows

Ce que vous saurez

  • Si un service donné est en cours d’exécution. En cours d’exécution, il est en bon état. Le démarrage, l’arrêt, la mise en pause ou la reprise donnent un avertissement, car un service coincé longtemps dans cet état est bloqué. Un service arrêté ou en pause est un problème, tout comme un service qui n’existe plus, par exemple après une désinstallation.

Chaque service a son propre court script et sa propre vérification, si bien que chaque alerte nomme le service qui s’est arrêté. Un service qui redémarre pour une mise à jour ne réveillera personne : dès qu’une vérification passe en problème, Gryphon la refait chaque minute et n’alerte que lorsque trois résultats de suite concordent.

Ce que cela ne vous dira pas : si le programme à l’intérieur du service fait son travail. Un service peut être en cours d’exécution et figé. Associez cette vérification à une autre sur ce que le service fournit : un point de terminaison Web, un port ou, pour SQL Server, une requête.

Avant de commencer

  • La machine Windows, ajoutée comme hôte dans Gryphon, avec l’agent Gryphon installé et connecté : la page de l’hôte indique Connecté.
  • Une fenêtre PowerShell en mode administrateur sur cette machine.

L’exemple surveille IIS, dont le service s’appelle W3SVC. Tout autre service fonctionne de la même façon.

Étapes

1Trouver le nom du service

Les scripts utilisent le nom du service, et non le nom d’affichage montré dans Services. Cette commande affiche les deux :

Dans PowerShell
Get-Service | Sort-Object DisplayName | Format-Table Name, DisplayName, Status

World Wide Web Publishing Service s’appelle W3SVC, SQL Server (MSSQLSERVER) s’appelle MSSQLSERVER et Print Spooler s’appelle Spooler.

2Activer les vérifications par script

Les vérifications par script sont désactivées tant que l’agent ne sait pas dans quel dossier les exécuter. Dans PowerShell en mode administrateur, ouvrez C:\ProgramData\Gryphon\agent.env dans le Bloc-notes (Notepad), décommentez la ligne GWC_SCRIPTS_DIR et redémarrez l’agent :

C:\ProgramData\Gryphon\agent.env
GWC_SCRIPTS_DIR=C:\ProgramData\Gryphon\scripts
Ensuite
Restart-Service GryphonAgent

3Ajouter un script pour le service

Créez le script dans le dossier des scripts, depuis la même fenêtre PowerShell en mode administrateur :

Dans PowerShell en mode administrateur
notepad C:\ProgramData\Gryphon\scripts\service-w3svc.ps1

Collez ceci, remplacez $Name par le nom de votre service, puis enregistrez :

service-w3svc.ps1
# Is one Windows service running? Running is healthy; starting, stopping or
# pausing is a warning; stopped or paused is a problem.
$Name = 'W3SVC'   # the service's name, as Get-Service shows it

try {
    $service = Get-Service -Name $Name -ErrorAction Stop
} catch {
    if ($_.CategoryInfo.Category -eq 'ObjectNotFound') {
        Write-Output "There is no service called $Name on this machine."
        exit 2
    }
    Write-Output ('Cannot read the service {0}: {1}' -f $Name, $_.Exception.Message)
    exit 3
}

$status = [string]$service.Status
$message = '{0} is {1}.' -f $service.DisplayName, $status
switch ($status) {
    'Running'         { Write-Output $message; exit 0 }
    'StartPending'    { Write-Output $message; exit 1 }
    'StopPending'     { Write-Output $message; exit 1 }
    'ContinuePending' { Write-Output $message; exit 1 }
    'PausePending'    { Write-Output $message; exit 1 }
    default           { Write-Output $message; exit 2 }
}

Pour un autre service, créez un autre fichier sous un autre nom, comme service-spooler.ps1. Les noms de fichier peuvent contenir des lettres, des chiffres, des points, des traits d’union et des traits de soulignement ; nommez donc le fichier d’un service comme MSSQL$SQLEXPRESS sans le $ : service-sqlexpress.ps1.

Créez chaque fichier dans le dossier de cette façon plutôt que de l’y copier. Un nouveau fichier prend les autorisations du dossier, que seuls les administrateurs peuvent modifier. Un fichier déplacé d’ailleurs garde les siennes, et l’agent refuse de l’exécuter, avec un message qui indique la commande icacls qui corrige le problème.

4Ajouter la vérification

Ouvrez l’hôte, allez dans Services, choisissez Ajouter le service, puis Script (agent) :

Ajouter : Script (agent) Services → Ajouter le service
Nom
IIS
Script
service-w3svc.ps1 — avec l’extension
Intervalle de vérification
Fréquence 3 Minutes

La première ligne de sortie du script, comme World Wide Web Publishing Service is Running., devient le message de la vérification. Le code de sortie 0 signifie en bon état, 1 avertissement, 2 problème et 3 inconnu : tout ce qui empêche le script de lire le service, sauf l’absence du service, donne inconnu plutôt que problème.

Faire un essai

  1. Exécutez le script vous-même pour voir ce qu’il répond : powershell -NoProfile -ExecutionPolicy Bypass -File C:\ProgramData\Gryphon\scripts\service-w3svc.ps1; $LASTEXITCODE
  2. Utilisez le bouton Vérifier maintenant de la vérification dans Gryphon. Il l’exécute comme le fait l’agent, sous le propre compte de l’agent.
  3. Sur une machine où c’est sans risque, arrêtez le service : Stop-Service W3SVC. À sa prochaine exécution, la vérification est en problème. Gryphon la refait ensuite chaque minute et alerte après trois résultats de suite ; prévenez donc d’abord les personnes qui reçoivent les alertes. Start-Service W3SVC le relance, et trois résultats en bon état annoncent le rétablissement.

Variantes

Tous les services à démarrage automatique

Une seule vérification pour toute la machine : tout service dont le type de démarrage est Automatic et qui n’est pas en cours d’exécution est un problème. Certains services automatiques démarrent, font leur travail et s’arrêtent de nouveau, et c’est voulu ; exécutez donc d’abord le script à la main et ajoutez à $Ignore tout ce qu’il affiche de normal sur votre machine.

automatic-services.ps1
# Is every service set to start automatically actually running? Some start,
# do their work and stop again by design: list those in $Ignore.
$Ignore = @('gupdate', 'edgeupdate', 'MapsBroker', 'sppsvc', 'RemoteRegistry', 'WbioSrvc')

$stopped = @(Get-Service | Where-Object {
    $_.StartType -eq 'Automatic' -and $_.Status -ne 'Running' -and $Ignore -notcontains $_.Name
})
if ($stopped.Count -gt 0) {
    Write-Output ('Not running: ' + (($stopped | ForEach-Object { $_.Name }) -join ', '))
    exit 2
}
Write-Output 'Every automatic service is running.'
exit 0

Il nomme tous les services arrêtés dans un seul message, mais c’est une seule vérification : un deuxième service qui s’arrête pendant que le premier est encore en panne n’envoie pas de deuxième alerte. Utilisez un script par service pour ceux qui comptent.

SQL Server Agent

Quand SQL Server Agent s’arrête, plus rien de planifié ne s’exécute, sauvegardes comprises, et SQL Server lui-même continue de répondre. Surveillez-le avec $Name = 'SQLSERVERAGENT', ou 'SQLAgent$NAME' pour une instance nommée. Pour SQL Server lui-même, voyez Surveiller SQL Server sous Windows.

Ce n’est pas ce que vous exploitez ? Parcourez tous les guides, ou dites-nous ce que vous devez surveiller et nous rédigerons le guide.

Quatorze jours gratuits. Puis à partir de $4.99 par mois.

L’agent, le tableau de bord, les applications et toutes les vérifications sauf les cinq pour Kubernetes font partie de chaque forfait. Les forfaits diffèrent par la quantité que vous surveillez, la fréquence, la provenance des vérifications, et le nombre de personnes et de pages d’état qu’ils comprennent. Comparer les forfaits. Annulez quand vous voulez.