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 :
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 :
GWC_SCRIPTS_DIR=C:\ProgramData\Gryphon\scripts
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 :
notepad C:\ProgramData\Gryphon\scripts\service-w3svc.ps1
Collez ceci, remplacez $Name par le nom de votre service, puis enregistrez :
# 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) :
- 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
- 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 - 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.
- 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 W3SVCle 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.
# 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.