Mini-test 9

Surveillance
d'un service

Verifier le service, le port et lire les logs

6 questions ciblees

service port parsing log audit

Cliquez Voir la solution sur chaque slide

← → naviguer · I indice · S solution · R recommencer

Question 1 / 6 verifier un service

Le service est-il actif ?

Vous surveillez ircd-hybrid. Donnez la commande systemd qui teste si le service est en cours, et la version qui s'integre a un if sans rien afficher.
a) Commande qui affiche "active" ou "inactive" :
b) Version silencieuse qui retourne juste un code de sortie (pour if) :
man systemctl et chercher is-active. L'option pour le silencieux est --quiet (ou -q).
SYSTEMCTL(1) - extrait du manuel
NAME
       systemctl - Control the systemd system and service manager

SYNOPSIS
       systemctl [OPTIONS...] COMMAND [UNIT...]

COMMANDES sur les UNITES (services)

   Etat (lecture, retournent un code de sortie)
       is-active UNIT       affiche "active"/"inactive" + code 0 si actif
       is-enabled UNIT      le service demarre-t-il au boot ?
       is-failed UNIT       est-il dans un etat failed ?
       status UNIT          affichage complet (statut + derniers logs)

   Controle (modifient l'etat)
       start UNIT           demarre le service
       stop UNIT            arrete le service
       restart UNIT         redemarre
       reload UNIT          recharge la config sans redemarrer

   Configuration du boot
       enable UNIT          configure pour demarrer au boot
       disable UNIT         retire du boot
       mask UNIT            empeche tout demarrage (lock)

   Vue d'ensemble
       list-units [--type=service]   liste les unites
       --failed             liste seulement celles en echec

OPTIONS
       --quiet, -q      aucun affichage, juste le code de sortie
       --no-pager          pas de pagination automatique
       --user              agir sur l'instance utilisateur

CODES DE SORTIE (utile dans les scripts)
       0  reussi / actif / enabled
       3  inactif / disabled
       autre  erreur

EXEMPLES
       # Test silencieux dans un script
       if systemctl is-active --quiet ircd-hybrid; then
           echo "OK"
       fi

       # Redemarrer si pas actif
       systemctl is-active --quiet ircd-hybrid || systemctl restart ircd-hybrid

       # Voir les services en echec
       systemctl --failed

       # Activer + demarrer au boot d'un coup
       systemctl enable --now ircd-hybrid
# a) Affichage humain
systemctl is-active ircd-hybrid
# Sortie : "active" ou "inactive" + code 0 ou non-nul

# b) Silencieux, code de sortie uniquement
systemctl is-active --quiet ircd-hybrid
# Aucune sortie ; code 0 si actif, non-nul sinon

# Utilisation dans un if :
if ! systemctl is-active --quiet ircd-hybrid; then
    echo "Service en panne, redemarrage..."
    systemctl restart ircd-hybrid
fi

Variantes utiles :

Question 2 / 6 verifier un port

Le port 6667 ecoute-t-il ?

Le service tourne, mais ecoute-t-il vraiment ? Trois facons de tester selon ou on est.
a) Test local : qui ecoute sur le port 6667 ?
b) Test depuis un autre poste : le port repond-il sur irc.quebec-libre.net ? (sans envoyer de donnees)
c) Le port ouvert ne suffit pas. Pour tester qu'un service web repond reellement (HTTP), quelle commande ?
Local : ss (remplace netstat) avec -tlnp pour TCP + listening + pas de DNS + processus. Distant : nc -zv teste l'ouverture sans envoyer de donnees. Service applicatif : curl ou wget.
# a) Local : qui ecoute (avec le PID + nom du processus)
sudo ss -tlnp | grep :6667

# b) Distant : test d'ouverture (sans envoyer de donnees)
nc -zv irc.quebec-libre.net 6667

# c) Service web : voir la reponse HTTP
curl -I https://exemple.com/
curl -s --connect-timeout 5 https://exemple.com/ | head

3 couches a connaitre :

Question 3 / 6 compter dans un log

Combien d'erreurs dans le log ?

Le fichier /var/log/ircd-hybrid.log contient les evenements du service. Chaque ligne d'erreur contient le mot ERROR.

Donnez la commande qui compte le nombre de lignes contenant ERROR :

man grep. L'option pour "compter au lieu d'afficher" est tres courte (une lettre).
grep -c "ERROR" /var/log/ircd-hybrid.log

Variantes utiles :

Cas reel - filtrer par date :

# Compter les erreurs d'aujourd'hui (si le log commence par AAAA-MM-JJ)
grep "$(date +%Y-%m-%d)" /var/log/ircd-hybrid.log | grep -c ERROR

Question 4 / 6 dernieres lignes

Voir les 5 dernieres erreurs

Vous voulez voir les 5 dernieres lignes ERROR du log (pour diagnostic rapide), sans afficher les milliers d'autres lignes.

Composez la commande avec un pipe :

Combiner grep et tail avec le symbole | (pipe). tail -n 5 garde les 5 dernieres lignes.
grep "ERROR" /var/log/ircd-hybrid.log | tail -n 5
# Variante courte : tail -5

Pipeline a connaitre :

# Suivre les nouvelles erreurs en temps reel
tail -f /var/log/ircd-hybrid.log | grep --line-buffered "ERROR"

# Voir les erreurs des 10 dernieres minutes (si timestamps ISO)
since=$(date -d "10 minutes ago" +%Y-%m-%dT%H:%M)
awk -v since="$since" '$1 > since' /var/log/ircd-hybrid.log | grep ERROR

# Toutes les erreurs UNIQUES (sans doublon)
grep "ERROR" /var/log/ircd-hybrid.log | sort -u

# Top 5 des messages d'erreur les plus frequents
grep "ERROR" /var/log/ircd-hybrid.log | sort | uniq -c | sort -rn | head -5

Question 5 / 6 awk : extraire un champ

Parser un log structure en colonnes

Le log /var/log/ircd-hybrid.log a le format suivant (3 champs separes par des espaces) :
2026-05-13T14:23:00 INFO Connexion de utilisateur123 2026-05-13T14:23:05 ERROR Authentification echouee pour bob 2026-05-13T14:23:07 INFO Deconnexion de utilisateur456 2026-05-13T14:23:09 WARN Trop de requetes depuis 1.2.3.4

a) Avec awk, extraire seulement la 2e colonne (LEVEL) :

b) Compter combien de chaque niveau (INFO, ERROR, WARN) : on prend la 2e colonne, on trie, on compte les doublons :

Avec awk, $1 = 1er champ, $2 = 2e, etc. Pour compter les doublons : pipe vers sort puis uniq -c.
# a) Extraire la 2e colonne (LEVEL)
awk '{print $2}' /var/log/ircd-hybrid.log
# Sortie :
# INFO
# ERROR
# INFO
# WARN

# b) Compter les occurrences par niveau
awk '{print $2}' /var/log/ircd-hybrid.log | sort | uniq -c
# Sortie :
#       1 ERROR
#       2 INFO
#       1 WARN

Autres patterns awk a connaitre :

# Filtrer + extraire en une commande
awk '$2 == "ERROR" {print $3}' /var/log/ircd-hybrid.log
# = pour chaque ligne ou la 2e colonne est "ERROR", afficher la 3e

# Compter directement avec awk
awk '$2 == "ERROR" {erreurs++} END {print erreurs}' /var/log/ircd-hybrid.log

# Avec un separateur custom (ex. ":")
awk -F':' '{print $1}' /etc/passwd

# Plusieurs colonnes
awk '{print $1, $2}' fichier.log

Cousins utiles :

Question 6 / 6 script complet

Surveiller en couches (script complet)

Composez un script surveiller-ircd.sh qui :
  1. verifie le service avec systemctl is-active --quiet
  2. verifie le port 6667 avec ss
  3. compte les erreurs recentes dans le log
  4. ecrit une ligne OK ou FAIL avec date dans /var/log/audit-ircd.log
Variables en haut (LOG=..., SERVICE=...), verifications en couches successives avec if !, $(date '+%Y...') pour l'horodatage, et >> pour ajouter au log d'audit.
SYSTEMCTL(1) - extrait du manuel
NAME
       systemctl - Control the systemd system and service manager

SYNOPSIS
       systemctl [OPTIONS...] COMMAND [UNIT...]

COMMANDES sur les UNITES (services)

   Etat (lecture, retournent un code de sortie)
       is-active UNIT       affiche "active"/"inactive" + code 0 si actif
       is-enabled UNIT      le service demarre-t-il au boot ?
       is-failed UNIT       est-il dans un etat failed ?
       status UNIT          affichage complet (statut + derniers logs)

   Controle (modifient l'etat)
       start UNIT           demarre le service
       stop UNIT            arrete le service
       restart UNIT         redemarre
       reload UNIT          recharge la config sans redemarrer

   Configuration du boot
       enable UNIT          configure pour demarrer au boot
       disable UNIT         retire du boot
       mask UNIT            empeche tout demarrage (lock)

   Vue d'ensemble
       list-units [--type=service]   liste les unites
       --failed             liste seulement celles en echec

OPTIONS
       --quiet, -q      aucun affichage, juste le code de sortie
       --no-pager          pas de pagination automatique
       --user              agir sur l'instance utilisateur

CODES DE SORTIE (utile dans les scripts)
       0  reussi / actif / enabled
       3  inactif / disabled
       autre  erreur

EXEMPLES
       # Test silencieux dans un script
       if systemctl is-active --quiet ircd-hybrid; then
           echo "OK"
       fi

       # Redemarrer si pas actif
       systemctl is-active --quiet ircd-hybrid || systemctl restart ircd-hybrid

       # Voir les services en echec
       systemctl --failed

       # Activer + demarrer au boot d'un coup
       systemctl enable --now ircd-hybrid
#!/bin/bash
# surveiller-ircd.sh

SERVICE="ircd-hybrid"
PORT=6667
LOG_AUDIT="/var/log/audit-ircd.log"
LOG_SERVICE="/var/log/ircd-hybrid.log"
HORODATAGE=$(date '+%Y-%m-%d %H:%M:%S')

# Couche 1 : service actif ?
if ! systemctl is-active --quiet "$SERVICE"; then
    echo "${HORODATAGE} FAIL service inactif" >> "$LOG_AUDIT"
    exit 1
fi

# Couche 2 : port ouvert ?
if ! ss -tln | grep -q ":${PORT} "; then
    echo "${HORODATAGE} FAIL port ${PORT} ferme" >> "$LOG_AUDIT"
    exit 1
fi

# Couche 3 : trop d'erreurs ?
nbErreurs=$(grep -c "ERROR" "$LOG_SERVICE")
if [ "$nbErreurs" -gt 50 ]; then
    echo "${HORODATAGE} WARN ${nbErreurs} erreurs dans le log" >> "$LOG_AUDIT"
    exit 2
fi

# Tout va bien
echo "${HORODATAGE} OK service+port+log" >> "$LOG_AUDIT"
exit 0

Reflexes appliques :

Bilan

Ce que vous venez de pratiquer

R pour recommencer.

« Retour aux mini-tests