Objectifs
- Planifier des tâches qui se répètent à intervalle régulier avec
cron. - Exécuter une commande une seule fois dans le futur avec
at. - Découvrir l’approche moderne et plus robuste des timers
systemd.
En DevOps, de nombreuses actions doivent être exécutées automatiquement : backups, nettoyages, rapports… Maîtriser les outils de planification est donc essentiel.
cron : Le planificateur classique
cron est le service historique sur les systèmes Unix pour exécuter des tâches récurrentes. Chaque utilisateur peut avoir sa propre table de planification, la crontab.
crontab -e: Pour éditer votre crontab.crontab -l: Pour lister son contenu.
Format d’une ligne crontab
# minute(0-59) heure(0-23) jour(1-31) mois(1-12) jour_semaine(0-6)
* * * * * /chemin/vers/la/commande
Exemples :
# Toutes les nuits à 2h30, lancer le script de backup.
# La sortie et les erreurs sont redirigées vers un fichier de log.
30 2 * * * /opt/scripts/backup.sh > /var/log/backup.log 2>&1
# Toutes les 15 minutes, lancer un script de monitoring.
*/15 * * * * /opt/scripts/monitoring.sh
Bonnes pratiques pour cron :
- Utilisez toujours des chemins absolus pour vos scripts.
- Redirigez toujours la sortie (
> ... 2>&1) pour éviter de recevoir des emails et pour conserver des logs.
at : Exécuter une tâche plus tard
at est un outil plus simple pour exécuter une commande une seule fois, à une heure spécifiée.
# Exécuter la commande dans 5 minutes
echo "sudo reboot" | at now + 5 minutes
# Exécuter à 16h30 aujourd'hui
at 16:30 < /chemin/vers/mon_script.sh
# Lister les tâches en attente
atq
C’est pratique pour des actions ponctuelles, mais moins utilisé en automatisation lourde.
Timers systemd : L’approche moderne
Sur la plupart des systèmes Linux modernes, systemd offre une alternative plus puissante et plus facile à déboguer que cron. Une tâche est définie par deux fichiers : un fichier .service (la commande) et un fichier .timer (la planification).
Exemple backup.service :
[Unit]
Description=Lancer mon backup
[Service]
ExecStart=/opt/scripts/backup.sh
Exemple backup.timer :
[Unit]
Description=Lance le backup tous les jours à 2h30
[Timer]
OnCalendar=daily 02:30:00
Persistent=true # S'exécute au démarrage si l'heure a été manquée
[Install]
WantedBy=timers.target
Avantages :
- Logs centralisés :
journalctl -u backup.servicevous montre toute l’historique et les sorties de votre tâche. - Meilleur contrôle : Vous pouvez spécifier des dépendances, des utilisateurs, des limites de ressources, etc.
Bonnes pratiques pour systemd :
- Pour les services système sur des serveurs modernes, préférez les timers à
cron. - N’oubliez pas de recharger
systemdaprès chaque modification :sudo systemctl daemon-reload. - Activez le timer au démarrage :
sudo systemctl enable mon_backup.timer.
Pièges courants
- Environnement d’exécution minimal : Que ce soit avec
cronousystemd, les scripts s’exécutent avec un environnement minimal (pas votre$PATHou vos alias habituels). C’est pourquoi les chemins absolus sont cruciaux. - Permissions : Le script doit être exécutable (
chmod +x) par l’utilisateur qui l’exécute (rootpour un service système, votre utilisateur pour unecrontabpersonnelle).
Exercices
-
Votre premier cronjob :
- Ouvrez votre
crontab(crontab -e). - Ajoutez une ligne qui écrit la date dans un fichier
/tmp/date.logtoutes les minutes. - Vérifiez que le fichier se met à jour, puis supprimez la ligne de votre
crontab.
- Ouvrez votre
-
Planifier avec
at:- Si la commande
atest installée, planifiez untouch /tmp/fichier_at.txtdans une minute. - Vérifiez que le fichier est bien créé.
- Si la commande
-
(Bonus) Créer un timer systemd :
- En tant qu’utilisateur (pas besoin de
sudo), créez les fichiers~/.config/systemd/user/hello.serviceet~/.config/systemd/user/hello.timer. - Le service doit simplement faire
echo "Hello depuis un timer systemd". - Le timer doit se déclencher toutes les 5 minutes.
- Activez-le avec
systemctl --user start hello.timeret vérifiez les logs avecjournalctl --user -u hello.service.
- En tant qu’utilisateur (pas besoin de