19/02/2025

Commandes et Système

Linux : comment planifier des tâches avec cron et la crontab ?

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)
Linux - Syntaxe de la crontab

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.

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

3 commentaires sur “Linux : comment planifier des tâches avec cron et la crontab ?

  • 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

    Répondre
  • Merci beaucoup c’est vraiment intéressant.

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.