Objectifs
- Planifier l’exécution récurrente de scripts avec
cron. - Comprendre le format d’une ligne
crontab. - Découvrir l’approche moderne de la planification avec les timers
systemd. - Savoir quand utiliser l’une ou l’autre de ces méthodes.
cron : Le planificateur de tâches traditionnel
cron est l’outil historique et universel sur les systèmes Unix pour exécuter des tâches à des moments précis. C’est un service qui tourne en permanence et qui lit des fichiers de configuration appelés crontab.
- Pour éditer votre
crontabpersonnelle :crontab -e - Pour lister son contenu :
crontab -l
Format d’une ligne crontab
Chaque ligne représente une tâche planifiée et suit un format strict de 6 champs.
# ┌───────────── minute (0 - 59)
# │ ┌───────────── heure (0 - 23)
# │ │ ┌───────────── jour du mois (1 - 31)
# │ │ │ ┌───────────── mois (1 - 12)
# │ │ │ │ ┌───────────── jour de la semaine (0 - 6) (0 ou 7 = Dimanche)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * /chemin/absolu/vers/la/commande
*: Le joker, qui signifie “chaque”.*/15: Signifie “toutes les 15” (ex: toutes les 15 minutes).0 3 * * 1: Signifie “à 3h00 du matin, tous les lundis”.
Exemple de crontab
# Désactiver l'envoi d'emails par défaut
MAILTO=""
# Toutes les nuits à 2h00, lancer le script de backup.
# Rediriger la sortie standard et les erreurs vers un fichier de log.
0 2 * * * /home/alice/scripts/backup.sh > /home/alice/logs/backup.log 2>&1
Points d’attention avec cron :
- L’environnement d’exécution est minimal. Il faut toujours utiliser des chemins absolus.
- Par défaut, toute sortie est envoyée par email. Il faut donc toujours rediriger la sortie vers un fichier de log ou
/dev/null.
Timers systemd : L’approche moderne
Sur les distributions Linux modernes, systemd offre une alternative plus puissante et plus transparente : les “timers”.
Le principe est de séparer la tâche de sa planification :
- Un fichier
.servicedécrit ce qu’il faut faire (la commande à exécuter). - Un fichier
.timerdécrit quand il faut le faire.
Avantages sur cron
- Journalisation intégrée : Plus besoin de gérer les redirections. Toute la sortie est automatiquement capturée et consultable avec
journalctl -u nom_du_service. - Gestion des dépendances : Vous pouvez spécifier qu’une tâche ne doit se lancer qu’après le démarrage du réseau, par exemple.
- Contrôle fin : Vous pouvez spécifier l’utilisateur, le répertoire de travail, les limites de ressources, etc., directement dans le fichier de service.
Exemple
Fichier backup.service :
[Unit]
Description=Lancer mon script de backup
[Service]
ExecStart=/home/alice/scripts/backup.sh
Fichier backup.timer :
[Unit]
Description=Lance le backup tous les jours à 2h
[Timer]
OnCalendar=daily 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
cron vs. Timers systemd : Lequel choisir ?
-
cron:- Avantages : Simple, universel (présent sur tous les systèmes de type Unix, y compris macOS et BSD).
- Idéal pour : Des tâches utilisateur simples et rapides, ou lorsque la portabilité est une priorité absolue.
-
Timers
systemd:- Avantages : Robuste, puissant, excellente journalisation, meilleur contrôle.
- Idéal pour : Les tâches d’administration système sur des serveurs Linux modernes.
En résumé : pour une tâche système sur un serveur de production moderne, préférez un timer systemd. Pour une petite tâche personnelle sur votre machine, cron reste parfaitement valable.
Exercices
-
Votre premier cronjob :
- Ouvrez votre crontab avec
crontab -e. - Ajoutez la ligne suivante pour écrire la date dans un fichier toutes les minutes :
* * * * * /bin/date >> /tmp/ma_cron.log 2>&1 - Attendez une ou deux minutes et vérifiez le contenu de
/tmp/ma_cron.log. - N’oubliez pas de supprimer la ligne de votre crontab après l’exercice (
crontab -e).
- Ouvrez votre crontab avec
-
Simulation d’un script de nuit :
- Écrivez une ligne de crontab qui exécuterait un script
/opt/scripts/rapport_mensuel.shle premier jour de chaque mois à 5h du matin.
- Écrivez une ligne de crontab qui exécuterait un script
-
(Théorique) Conversion en timer :
- Comment traduiriez-vous la tâche de l’exercice 2 en un timer
systemd? - Quelle serait la valeur de la directive
OnCalendar=dans le fichier.timer? (Indice :monthlyou*-*-01 05:00:00).
- Comment traduiriez-vous la tâche de l’exercice 2 en un timer