Linux pour les devs - 15 - cron : les taches planifiees

crontab, syntaxe cron, systemd timers, at et anacron : planifier des taches automatiques sur Linux.

  1. 01 Linux pour les devs - 00 - Pourquoi Linux meme si tu codes sur Mac ou Windows
  2. 02 Linux pour les devs - 01 - Le terminal, bash et zsh
  3. 03 Linux pour les devs - 02 - Fichiers et répertoires
  4. 04 Linux pour les devs - 03 - Permissions et droits d'acces
  5. 05 Linux pour les devs - 04 - Utilisateurs, groupes et sudo
  6. 06 Linux pour les devs - 05 - nano, vim, sed et awk
  7. 07 Linux pour les devs - 06 - Pipes et redirections
  8. 08 Linux pour les devs - 07 - grep et find en profondeur
  9. 09 Linux pour les devs - 08 - Les processus : comprendre ce qui tourne sur ta machine
  10. 10 Linux pour les devs - 09 - systemd : gerer tes services comme un pro
  11. 11 Linux pour les devs - 10 - Le réseau : comprendre ce qui passe par le fil
  12. 12 Linux pour les devs - 11 - Le firewall : contrôler qui entre et qui sort
  13. 13 Linux pour les devs - 12 - SSH : l'acces distant sécurisé
  14. 14 Linux pour les devs - 13 - Les variables d'environnement : configurer sans hardcoder
  15. 15 Linux pour les devs - 14 - Scripts bash : automatiser pour ne plus se répéter
  16. 16 Linux pour les devs - 15 - cron : les taches planifiees
  17. 17 Linux pour les devs - 16 - Les logs : lire, filtrer, comprendre
  18. 18 Linux pour les devs - 17 - Stockage et disques
  19. 19 Linux pour les devs - 18 - Les gestionnaires de paquets
  20. 20 Linux pour les devs - 19 - Les conteneurs sans Docker
  21. 21 Linux pour les devs - 20 - Securiser un serveur Linux
  22. 22 Linux pour les devs - 21 - Performance et diagnostic
  23. 23 Linux pour les devs - 22 - tmux : le multiplexeur de terminal
  24. 24 Linux pour les devs - 23 - Glossaire Linux

15 - cron : les taches planifiees

Ce que tu vas apprendre

  • Utiliser crontab pour créer et gerer des taches planifiees
  • Maitriser la syntaxe cron (les cinq etoiles)
  • Logger la sortie de tes taches cron
  • Comparer cron et les timers systemd
  • Utiliser at pour les taches ponctuelles et anacron pour les machines pas toujours allumees

Prerequisites

Savoir écrire des scripts bash et comprendre les bases de systemd.


Mon premier cron job, c'etait un script de backup qui tournait toutes les nuits. J'etais fier. Sauf que le script avait une erreur, la sortie allait nulle part, et j'ai découvert trois mois plus tard que je n'avais aucun backup. La leçon : un cron job sans logging, ca n'existe pas.

crontab : les bases

crontab est l'outil pour gerer les taches planifiees de l'utilisateur courant :

bash# Voir tes taches planifiees
crontab -l

# Editer tes taches
crontab -e

# Voir les taches d'un autre utilisateur (root seulement)
sudo crontab -l -u deploy

# Supprimer toutes tes taches (attention)
crontab -r

La syntaxe cron

Chaque ligne de crontab suit ce format :

# minute  heure  jour_du_mois  mois  jour_de_la_semaine  commande
# (0-59)  (0-23)    (1-31)    (1-12)     (0-7, 0=7=dim)

# Tous les jours a 3h du matin
0 3 * * * /opt/scripts/backup.sh

# Toutes les 15 minutes
*/15 * * * * /opt/scripts/health-check.sh

# Du lundi au vendredi a 9h
0 9 * * 1-5 /opt/scripts/rapport.sh

# Le premier du mois a minuit
0 0 1 * * /opt/scripts/cleanup-mensuel.sh

# Toutes les heures, les jours de semaine
0 * * * 1-5 /opt/scripts/sync.sh

# Tous les dimanches a 2h30
30 2 * * 0 /opt/scripts/maintenance.sh

La syntaxe est compacte et un peu cryptique. Je ne la retiens jamais parfaitement, et c'est la que crontab.guru entre en jeu. Tu tapes ton expression et il te dit en anglais ce que ca fait. Indispensable.

Quelques raccourcis utiles :

@reboot    /opt/scripts/startup.sh      # Au demarrage
@hourly    /opt/scripts/check.sh        # Toutes les heures (0 * * * *)
@daily     /opt/scripts/backup.sh       # Tous les jours (0 0 * * *)
@weekly    /opt/scripts/report.sh       # Toutes les semaines (0 0 * * 0)
@monthly   /opt/scripts/cleanup.sh      # Tous les mois (0 0 1 * *)

Logger la sortie : la regle numero un

Par défaut, cron envoie la sortie par email. Si le mail n'est pas configure (et il ne l'est presque jamais), la sortie disparaît dans le neant. Redirige toujours vers un fichier :

bash# Rediriger stdout et stderr vers un fichier
0 3 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1

# Avec la date dans le log
0 3 * * * /opt/scripts/backup.sh >> /var/log/backup-$(date +\%Y\%m\%d).log 2>&1

# Note : le % a un sens special dans crontab, il faut l'echapper avec \

Sur paltemps.fr, chaque cron job écrit dans un fichier de log dédié. Quand quelque chose ne marche pas, je sais exactement ou regarder.

Les pièges classiques de cron

Le PATH est minimal. Cron n'a pas le meme PATH que ton terminal. Si ton script utilise node ou bun, utilise le chemin complet :

bash# Ca risque de ne pas marcher
0 * * * * node /opt/scripts/check.js

# Ca marche
0 * * * * /usr/local/bin/node /opt/scripts/check.js

# Ou definis le PATH en haut du crontab
PATH=/usr/local/bin:/usr/bin:/bin
0 * * * * node /opt/scripts/check.js

Le répertoire de travail est ~. Si ton script depend de fichiers relatifs, utilise cd au début :

bash0 3 * * * cd /opt/mon-app && ./backup.sh >> /var/log/backup.log 2>&1

Les variables d'environnement ne sont pas chargees. .bashrc n'est pas lu. Si ton script a besoin de variables, définis-les dans le script ou dans le crontab.

cron vs systemd timers

On a vu les timers systemd dans un article précédent. Voici une comparaison honnete :

Aspect cron systemd timers
Simplicite Une ligne suffit Deux fichiers (.service + .timer)
Logs A gerer soi-meme Integres dans journalctl
Historique Aucun Visible avec systemctl
Rattrapage Non (sauf anacron) Oui avec Persistent=true
Dépendances Non Oui (After=, Requires=)
Disponibilite Partout Uniquement avec systemd

Mon avis : pour une tache simple (backup quotidien, cleanup), cron suffit. Pour une tache critique qui doit etre tracable et fiable, les timers systemd sont supérieurs.

at : les taches ponctuelles

at exécuté une commande une seule fois, a un moment precis. Utile pour les opérations ponctuelles :

bash# Installer si necessaire
sudo apt install at

# Executer une commande dans 30 minutes
echo "/opt/scripts/migration.sh" | at now + 30 minutes

# A une heure precise
echo "/opt/scripts/deploy.sh" | at 14:30

# Demain a 3h du matin
echo "/opt/scripts/cleanup.sh" | at 3:00 AM tomorrow

# Voir les taches en attente
atq

# Supprimer une tache par son numero
atrm 5

# Mode interactif
at 22:00
> /opt/scripts/backup.sh
> Ctrl+D

anacron : pour les machines pas toujours allumees

cron suppose que la machine tourne 24h/24. Si elle est eteinte au moment prevu, la tache ne s'exécuté pas. anacron resout ca : il lance les taches manquees au prochain démarrage.

bash# /etc/anacrontab
# periode  delai(min)  identifiant  commande
1          5           backup       /opt/scripts/backup.sh
7          10          cleanup      /opt/scripts/weekly-cleanup.sh
30         15          rapport      /opt/scripts/monthly-report.sh

La première colonne est la periodicite en jours. Le delai évité que tout se lance en meme temps au boot. anacron est surtout utile pour les laptops et les postes de travail.

Exemples concrets

bash# Backup de PostgreSQL tous les jours a 2h
0 2 * * * pg_dump -U deploy monapp | gzip > /opt/backups/db_$(date +\%Y\%m\%d).sql.gz 2>> /var/log/backup.log

# Nettoyage des logs de plus de 30 jours, chaque dimanche
0 4 * * 0 find /var/log/app -name "*.log" -mtime +30 -delete

# Verification du certificat SSL chaque lundi
0 9 * * 1 /opt/scripts/check-ssl.sh >> /var/log/ssl-check.log 2>&1

# Rotation des backups : garder les 7 derniers
0 3 * * * ls -t /opt/backups/db_*.sql.gz | tail -n +8 | xargs -r rm

# Surveillance disque : alerte si plus de 90%
*/30 * * * * /opt/scripts/disk-alert.sh

Le script de surveillance disque :

bash#!/usr/bin/env bash
set -euo pipefail

seuil=90
usage=$(df / | tail -1 | awk '{print $5}' | tr -d '%')

if [[ "$usage" -gt "$seuil" ]]; then
    echo "Alerte : disque a ${usage}% sur $(hostname)" | \
        mail -s "Disque plein" admin@example.com
fi

Résumé

  • crontab -e pour éditer, crontab -l pour lister
  • Utilise crontab.guru pour vérifier ta syntaxe
  • Redirige toujours stdout et stderr vers un fichier de log
  • Attention au PATH minimal et aux variables d'environnement dans cron
  • Les timers systemd sont plus robustes pour les taches critiques
  • at pour les taches ponctuelles, anacron pour les machines intermittentes

Article précédent : Les scripts bash Article suivant : Les logs

Sources

Réservez un audit gratuit de 30 minutes. Je vous montre concrètement ce qu'on peut automatiser.