Passer au contenu principal

Surveillance des fichiers d'unité systemd sur Linux

Why Linux systemd unit files trigger false 'Down' alerts in service monitors and how to monitor them accurately using a script monitor.

Introduction

Certains services Linux sont conçus pour se terminer après l'initialisation — ce qui perturbe les moniteurs de service. Si vous en surveillez un avec un moniteur de service dans Level, vous recevrez de fausses alertes. La solution consiste à utiliser un moniteur de script qui lit SubState au lieu de ActiveState.


Pourquoi les moniteurs de service déclenchent de fausses alertes

systemd suit chaque unité à travers deux champs d'état : ActiveState et SubState. Les moniteurs de service vérifient ActiveState — des valeurs telles que active, inactive, ou failed.

Le problème : certains services se terminent après avoir accompli leur tâche et n'entrent jamais dans un état active état. Le wg-quick est l'exemple le plus courant. Il configure l'interface VPN, puis se termine. systemd enregistre ActiveState comme inactive (exited). Un moniteur de service voit inactive et déclenche une alerte — même si le VPN fonctionne correctement, que l'interface est active et que le trafic est acheminé.

Wiregard Example

SubState donne une image plus précise. Pour les services comme wg-quick, un SubState sain est exited — attendu et normal. Un SubState de failed signifierait qu'un problème s'est réellement produit. Vérifier SubState directement est ce qui vous permet de faire la différence.


Vérifier le SubState avec un script

Utilisez systemctl show pour lire le SubState de n'importe quelle unité :

systemctl show -p SubState --value <unit_name>

Cela renvoie une seule chaîne de caractères — running, exited, dead, failed, etc. — que vous pouvez évaluer dans un moniteur de script.

🖥️ NOTE DE PLATEFORME :

  • Linux : Pris en charge sur toute distribution utilisant systemd.

  • Windows / macOS : Non applicable. systemctl est réservé à Linux.


Exemple : Surveillance d'une interface WireGuard

Le script ci-dessous vérifie si wg-quick@wg0 est dans le exited SubState. Remplacez par le nom réel de votre unité si celui-ci est différent.

#!/bin/bash

UNIT_NAME="wg-quick@wg0"
STATUS=$(systemctl show -p SubState --value $UNIT_NAME)

if [ "$STATUS" = "exited" ]; then
echo "Service is running correctly."
exit 0
else
echo "ALERT: Service is not running. SubState: $STATUS"
exit 1
fi

Le script produit une chaîne d'état lisible et se termine avec le code 0 (sain) ou 1 (état inattendu). Configurez le moniteur de script pour se déclencher lorsque la sortie Contient la chaîne d'échec «ALERT».

Configuration du moniteur :

Champ

Valeur

Type

Exécuter le script

Système d'exploitation

Linux

Script

Linux - Vérification du SubState WireGuard

Sortie du script

Contient

Valeur

ALERT

Fréquence d'exécution

5 minutes

Nombre de déclenchements

2

💡 CONSEIL : Définissez Nombre de déclenchements à 2 ou plus pour éviter les alertes dues aux états transitoires lors des redémarrages du service ou du système.


Autres types d'unités qui se terminent par conception

wg-quick est le cas le plus courant, mais chacun de ceux-ci peut déclencher le même schéma de fausse alerte :

  • Services oneshot — exécute une tâche et se termine ; SubState sera exited lorsqu'il est sain

  • Unités de minuterie — s'exécutent selon une planification ; vérifiez ActiveState pour l'unité de minuterie elle-même, pas pour le service qu'elle lance

  • Services Type=forking — le processus parent se termine après avoir créé un processus enfant ; le SubState peut être exited pendant l'exécution du processus enfant

Pour tous ces cas, un moniteur de script vérifiant SubState par rapport à votre valeur correcte connue est la bonne approche.


FAQ

  • Mon service WireGuard apparaît comme Hors ligne dans Level mais le trafic est acheminé correctement. Que se passe-t-il ? wg-quick se termine après avoir configuré l'interface VPN — c'est normal. L'interface réseau reste active même si le processus du service s'est terminé. Un moniteur de service voit inactive et déclenche une alerte. Utilisez un moniteur de script qui vérifie SubState (qui renvoie exited, la valeur saine) à la place.

  • Comment savoir quelle valeur de SubState attendre lorsqu'un service est sain ? Exécutez systemctl show -p SubState --value <unit_name> sur un appareil où le service fonctionne correctement. Quelle que soit la valeur renvoyée, c'est votre référence saine. Écrivez le script en fonction de cette valeur.

  • Puis-je vérifier à la fois ActiveState et SubState dans le même moniteur ? Oui. Écrivez le script pour lire les deux et échouer si l'un ou l'autre est inattendu. Cela vous offre une couverture plus large — vous pouvez détecter les services qui se sont terminés de manière inattendue (SubState: failed) séparément des services qui sont simplement arrêtés (ActiveState: inactive).

  • Cette solution fonctionne-t-elle sur les distributions Linux qui n'utilisent pas systemd ? Non. systemctl nécessite systemd. Sur les distributions utilisant SysVinit ou Upstart, vous auriez besoin d'outils différents (par exemple, service <name> status). La plupart des distributions Linux activement maintenues sont livrées avec systemd.

Avez-vous trouvé la réponse à votre question ?