📄 contenu.md 🔒 6501de46…ce12f4f4 Se connecter pour télécharger ← Retour
# 12. Automatisation et planification

Cette section couvre la planification de tâches (cron et son successeur
systemd timers) et les principes de robustesse d'un script shell destiné à
tourner sans supervision humaine directe.

## cron — le planificateur historique

`cron` lit des fichiers crontab (syntaxe `minute heure jour mois
jour_semaine commande`) et déclenche les commandes correspondantes à
l'heure indiquée. Limites structurelles bien connues : aucune garantie de
rattrapage si la machine était éteinte au moment prévu (sauf variante
`anacron`, pensée justement pour ce cas sur des machines pas toujours
allumées), aucune gestion native des dépendances entre tâches, et une
sortie d'erreur envoyée par mail local par défaut — souvent jamais
consultée sur un serveur moderne sans MTA configuré.

## systemd timers — l'alternative moderne

Une unité `.timer` déclenche une unité `.service` associée, avec deux
familles d'expression temporelle :

- **`OnCalendar=`** : expression calendaire proche de la syntaxe cron mais
  plus lisible (`OnCalendar=Mon..Fri 09:00`), avec **rattrapage natif** via
  `Persistent=true` — si la machine était éteinte à l'heure prévue, la
  tâche se déclenche au prochain démarrage.
- **`OnBootSec=`/`OnUnitActiveSec=`** : délai relatif (depuis le
  démarrage, ou depuis la dernière exécution) plutôt qu'une heure fixe —
  utile pour un intervalle régulier indépendant de l'heure du jour.

Avantages structurels sur cron : les journaux d'exécution passent par
journald (section 2, historique interrogeable, pas seulement le dernier
run), le service déclenché bénéficie de toutes les protections
`systemd` habituelles (limites de ressources cgroup, isolation de
répertoire avec `ProtectSystem=`/`ProtectHome=`...), et les dépendances
(`After=`/`Requires=`) s'expriment avec le même langage que le reste du
système.

## Principes de robustesse d'un script d'automatisation

Un script destiné à tourner sans supervision doit respecter plusieurs
garde-fous, indépendamment de l'outil qui le déclenche :

- **Idempotence** : ré-exécuter le script une deuxième fois de suite (après
  un échec partiel, ou par accident) doit produire le même état final
  sans effet de bord cumulatif — ex. vérifier l'absence d'une ressource
  avant de la créer, plutôt que de supposer qu'elle n'existe jamais encore.
- **Verrouillage d'exécution** (`flock` sur un fichier dédié) : empêche
  deux instances du même script planifié de tourner simultanément si la
  précédente exécution dépasse l'intervalle de planification.
- **Codes de sortie explicites** et **journalisation systématique** : un
  script qui échoue silencieusement (code de sortie 0 malgré une erreur
  réelle) est le pire cas — le planificateur ne le signale jamais comme
  en échec.
- **Séparation configuration/code** : les paramètres variables (chemins,
  seuils, destinataires d'alerte) dans un fichier de configuration
  externe plutôt que codés en dur dans le script, pour permettre un
  ajustement sans modifier le code lui-même.

*(Schéma disponible : `schema.svg`, dans ce dossier.)*
3.0 Ko BLAKE3 : 6501de46…ce12f4f4