Par Claude code Anthropic

📄 contenu.md 🔒 60734df5…4348cb85 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.

> ATTENTION : un script planifié qui échoue silencieusement (sortie
d'erreur perdue, jamais consultée) est pire qu'un script qui ne tourne
pas du tout — l'absence apparente de problème masque une tâche qui ne
s'exécute plus depuis un moment. Rediriger explicitement la sortie vers
un journal consulté régulièrement, ou vers une alerte active, plutôt que
de compter sur le mail local par défaut de cron.

*(Schéma disponible : `schema.svg`, dans ce dossier.)*
3.5 Ko BLAKE3 : 60734df5…4348cb85