Linux : comment planifier des tâches avec cron et la crontab ?
Sommaire
I. Présentation
Sous Linux, l'exécution de tâches planifiées s'effectue généralement grâce à ce que l'on appelle des tâches Cron définies dans le fichier de configuration Crontab. Il s'agit aussi d'une façon d'automatiser des tâches sur une machine Linux. Cela permet de planifier l'exécution de tâches à des moments précis ou à intervalles réguliers, simplifiant ainsi l'automatisation sous Linux.
Dans cet article, nous allons explorer l'utilisation de Crontab, en évoquant tout d'abord sa syntaxe, pour ensuite étudier des exemples concrets d'utilisation. L'objectif est que vous soyez à l'aise avec la planification des tâches sous Linux suite à la lecture de ce tutoriel.
Version originale de l'article : 6 juin 2013
II. Crontab, c'est quoi ?
Cron est un outil Linux qui exécute des tâches planifiées ("cron jobs") à des moments spécifiques. Il tourne en arrière-plan sur la machine Linux et va exécuter les tâches définies dans un fichier appelé crontab (abréviation de "cron table"), propre à chaque utilisateur. Il y a donc une crontab pour le super-utilisateur root, ainsi que pour les autres utilisateurs du système (que nous utiliserons en fonction des besoins).
Avec crontab, chaque utilisateur peut planifier des commandes et des scripts à exécuter à des dates et heures définies. Il est envisageable d'exécuter une tâche à un moment précis ou selon une fréquence particulière : toutes les 5 minutes, à 04h00 du matin tous les jours, ou encore un jour sur deux. La syntaxe de la crontab, que nous étudierons par la suite, rend le système très flexible.
L'administrateur système peut définir des tâches planifiées au niveau global dans /etc/crontab
ou dans /etc/cron.d/
. Le fichier /etc/crontab
est un fichier système généré automatiquement par Linux. Il va aussi lire les fichiers présents dans les répertoires suivants : /etc/cron.hourly
, /etc/cron.daily
, /etc/cron.weekly
et /etc/cron.monthly
.
Plusieurs commandes sont à connaître pour manipuler les tâches cron d'une machine Linux :
# éditer la crontab de l'utilisateur actuel
crontab -e
# afficher la crontab actuelle
crontab -l
# supprimer la crontab de l'utilisateur
crontab -r
# lister la crontab de l'utilisateur "flo"
crontab -u flo -l
Si vous tombez sur une machine où cron n'est pas disponible, sachez qu'il est possible de l'installer et de l'activer :
sudo apt update && sudo apt install cron
sudo systemctl enable cron
III. La syntaxe de la crontab
Avant d'envisager d'éditer la crontab d'un utilisateur, vous devez prendre le temps d'appréhender la syntaxe à respecter. Dans ce fichier, chaque ligne correspond à une tâche planifiée différente. Puis, chaque ligne de la crontab suit une syntaxe bien définie avec plusieurs colonnes :
* * * * * <commande à exécuter>
| | | | |
| | | | ----- Jour de la semaine (0 - 7) [où 0 et 7 = dimanche]
| | | ------- Mois (1 - 12)
| | --------- Jour du mois (1 - 31)
| ----------- Heure (0 - 23)
------------- Minute (0 - 59)
Tout en sachant que la présence de l'astérisque "*" signifie "toutes les occurrences possibles". Donc, si vous mettez un "*" dans la troisième colonne, la commande sera exécutée tous les jours du mois.
D'une façon générale, il y a plusieurs caractères spéciaux que vous pouvez utiliser pour affiner les planifications :
*
: chaque valeur possible.,
: plusieurs valeurs possibles (par exemple :1,15
signifie le 1er et le 15e).-
: intervalle (par exemple :1-5
signifie du 1er au 5e)./
: incrément (par exemple :*/10
toutes les 10 unités, soit toutes les 10 minutes, si c'est inscrit dans la colonne des minutes).
Il y a également des entrées spéciales qui sont comme des alias pour faciliter l'écriture de certaines fréquences :
@reboot
: au démarrage.@hourly
: chaque heure.@daily
: chaque jour.@weekly
: chaque semaine.@monthly
: chaque mois.@yearly
: chaque année.
IV. Exemples d'utilisation de la crontab
Désormais, nous allons étudier plusieurs exemples d'utilisation de la crontab afin d'effectuer une prise en main. Cela va vous permettre de planifier la tâche de votre choix. Ce sera l'occasion de vous apporter des détails supplémentaires sur le fonctionnement de la crontab.
A. Exécuter un script Bash chaque jour à minuit
Pour exécuter un script Bash chaque jour à minuit, par exemple, un script de sauvegarde, nous pouvons configurer une tâche planifiée dans la crontab. Commencez par éditer la crontab de votre utilisateur :
crontab -e
La première fois que vous allez éditer la crontab, vous serez invité à sélectionner l'éditeur de texte avec lequel effectuer l'édition. Nano est la solution la plus simple, que vous pouvez sélectionner en indiquant "1" puis Entrée.
Vous arrivez sur un fichier avec un bloc de commentaires. Il explique la syntaxe de la crontab de façon synthétique. À la suite, vous n'avez qu'à déclarer votre tâche planifiée, comme ceci pour l'exécuter tous les jours à minuit :
0 0 * * * /home/flo/scripts/backup.sh
Ce qui donne :
Vous n'avez plus qu'à enregistrer la crontab avec "CTRL + O" si vous utilisez Nano. Pensez à rendre exécutable le script Bash, sinon il ne pourra pas s'exécuter.
Par défaut, la sortie standard (stdout
) et la sortie d'erreur (stderr
) des commandes exécutées via crontab sont envoyées par e-mail à l'utilisateur qui possède la crontab. Ainsi, la ligne ci-dessus, bien que fonctionnelle, peut être améliorée en jouant sur la redirection de la sortie de la cron.
- Rendre la tâche planifiée silencieuse grâce à la redirection de la sortie dans
/dev/null
.
0 0 * * * /home/flo/scripts/backup.sh > /dev/null 2>&1
- Rediriger la sortie standard vers un fichier de log (journal).
0 0 * * * /home/flo/scripts/backup.sh >> backup.log
- Rediriger la sortie standard et les erreurs vers un fichier de log (journal).
0 0 * * * /home/flo/scripts/backup.sh >> backup.log 2>&1
B. Purger un dossier de façon automatique
Si vous avez besoin de nettoyer (purger) de façon automatique un répertoire, selon peut être fait via une crontab. L'exemple ci-dessous va purger le répertoire /home/flo/tmp
tous les lundis à 06h00 du matin.
0 6 * * 1 /usr/bin/rm -rf /home/flo/tmp/*
Quand vous exécutez un binaire avec une tâche cron, il est recommandé de préciser le chemin d'accès complet, comme ici /usr/bin/rm
. Vous pouvez obtenir cette information facilement avec whereis
:
whereis rm
C. Envoyer une alerte par e-mail en cas de redémarrage
Un script peut être configuré pour notifier un administrateur lorsque le serveur Linux redémarre. Dans ce cas, nous pouvons utiliser l'alias @reboot pour faciliter l'écriture de notre ligne de cron.
@reboot echo "Le serveur a redémarré le $(date '+%Y-%m-%d à %H:%M:%S')" | mail -s "Alerte reboot du serveur IT-Connect" admin-demo@it-connect.fr
D. Fréquences d'exécution diverses et variées
Lors de la création d'une tâche planifiée, la clé réside dans l'utilisation de la bonne syntaxe pour planifier correctement la tâche et obtenir le résultat attendu. Pour vous aider, voici quelques exemples supplémentaires.
# Exécution toutes les 5 minutes
*/5 * * * * <commande>
# Exécution chaque dimanche à 22h15
15 22 * * 0 <commande>
# Exécution tous les jours ouvrés (lundi à vendredi) à 08h00
0 8 * * 1-5 <commande>
# Exécution le premier jour de chaque mois à minuit
0 0 1 * * <commande>
# Exécution à 03h00 du matin un jour sur deux
0 3 */2 * * <commande>
# Exécution du 1er au 10ème jour de chaque mois, à 03h00 du matin
0 3 1-10 * * <commande>
Si vous avez besoin d'aide pour vérifier votre syntaxe ou tout simplement la générer, il y a deux sites très utiles que vous pouvez utiliser :
- crontab-generator.org : vous n'avez qu'à sélectionner vos besoins pour la fréquence d'exécution et l'outil va générer la bonne ligne de crontab.
- crontab.guru : vous pouvez indiquer votre ligne de crontab (sans la commande) et l'outil va la traduire sous forme de texte. C'est très pratique pour vérifier la syntaxe de la tâche cron.
V. Conclusion
Vous êtes désormais en mesure de comprendre l’utilité de crontab, de l’utiliser et de journaliser les tâches que vous mettez en place. Pour planifier des tâches sous Linux, il est également possible d'utiliser les timers
de systemd
. Nous pourrons aborder cette seconde méthode dans un futur article.
Si vous souhaitez piloter et superviser les tâches planifiées d'un ensemble de serveurs, vous pouvez vous orienter vers une solution comme Apache Airflow.
Excellent tutoriel….
Je souhaite faire tourner un script dans la nuit de dimanche à lundi de 20h le soir jusqu’à 8h00 le lendemain.
Que mets tu dans ton crontab ?
Cdt
Merci beaucoup c’est vraiment intéressant.
👍