Cron est un utilitaire UNIX simple qui gère et planifie l’exécution des commandes sur votre ordinateur. Il a été développé pour la première fois en 1987 par Paul Vixie et est depuis devenu un outil inestimable dans les systèmes d’exploitation basés sur Linux, tant pour les administrateurs que pour les utilisateurs.
De nos jours, il existe un certain nombre d’implémentations et de réécritures cron que vous pouvez facilement installer sur votre système Linux. Malgré les différences, ces programmes partagent tous la même lignée Vixie Cron.
En tant que tel, cet article vise à fournir un aperçu de base du fonctionnement du cron Vixie original, de sa syntaxe et de la manière dont vous pouvez l’utiliser pour planifier des tâches dans votre système Linux.
Comment fonctionne Cron ?
Cron est un utilitaire UNIX incroyablement simple. Il fonctionne en deux parties. Cron s’exécute d’abord en tant que processus d’arrière-plan qui démarre lorsque vous démarrez votre système pour la première fois.
À partir de là, il lit ensuite un fichier spécifique toutes les minutes. Ce fichier contient une liste de commandes qui, à leur tour, consistent en un code temporel et un chemin de fichier pour chaque script ou programme que vous souhaitez exécuter.
Cette approche permet à cron d’être très flexible dans les grands systèmes. Par exemple, les implémentations cron modernes telles que Cronie n’exécutent qu’une seule instance de cron même si cette machine héberge plusieurs utilisateurs.
Cronie rend cela possible en fournissant des crontabs locaux pour chaque utilisateur installé dans le système. En tant que tel, cron a seulement besoin de savoir à qui appartient la crontab, le niveau d’autorisation de cet utilisateur et les commandes à l’intérieur de la crontab.
Cela rend non seulement le système plus efficace, mais également plus sûr en réduisant le nombre de programmes privilégiés exécutés en mémoire.
Crontab : le cœur de Cron
Chaque implémentation cron utilise une certaine forme de crontab. Il s’agit d’un simple fichier texte qui contient toutes les commandes que cron exécutera pour cet utilisateur particulier. Comme décrit ci-dessus, chaque utilisateur du système a sa propre crontab. Ils peuvent afficher en exécutant la commande suivante :
Cela imprimera le contenu de la crontab de l’utilisateur actuel sur la sortie standard. Cela peut être extrêmement utile si vous voulez simplement voir rapidement quelles commandes cron exécute pour cet utilisateur.
Pour le modifier, vous devrez exécuter la commande :
Cela indiquera à cron d’exécuter votre éditeur de texte par défaut et de charger le fichier crontab à l’intérieur. Cela vous permettra de modifier le fichier crontab.
La syntaxe Crontab
La syntaxe du fichier crontab est incroyablement simple. Une seule ligne dans ce fichier indiquera une commande correspondante qui doit être exécutée pour cet utilisateur particulier. La forme générale d’une commande crontab ressemble à ceci :
m h d mon dow [flags] command
L’intervalle de temps est un champ de cinq chiffres dans lequel vous pouvez indiquer à cron la fréquence à laquelle vous souhaitez exécuter une commande. Il s’agit de la fonctionnalité principale de toute implémentation cron et cela vous permet d’être à la fois spécifique et flexible dans la façon dont cron traite les tâches récurrentes.
- m = minute entre 0 et 59
- h = heure entre 0 et 23
- d = jour du mois entre 1 et 31
- lun = mois entre 1 et 12
- dow = jour de la semaine entre 0 et 6. Zéro est dimanche.
La flags
field est un ensemble d’options qui modifient le comportement de cron pour une seule commande. Par exemple, vous pouvez inclure le -n
option pour empêcher cron d’envoyer du courrier système.
La command
champ est la commande que cron exécutera à des intervalles définis. Il peut s’agir soit d’un script shell que vous avez écrit, soit d’un chemin de programme avec des indicateurs.
Sachant cela, vous pouvez utiliser tous ces éléments ensemble dans une seule ligne crontab pour créer des intervalles de temps spécifiques pour vos tâches. Par exemple, je peux exécuter un script sur mon système Ubuntu tous les 24 juillet à 2 h 30 en écrivant la ligne crontab suivante:
30 2 24 7 * /home/$USER/myscript.sh
Noter: Il est recommandé d’exécuter une tâche cron à un nombre de minutes « peu commun » (11, 27 34, etc.) pour éviter que différentes tâches cron ne se chevauchent.
Codes courts
Crontab vous permet d’utiliser des codes abrégés pour faciliter la lecture de vos entrées cron.
@reboot
– Exécuter une fois, au démarrage@yearly
– Exécuter une fois par an, « 0 0 1 1 * ».</>@annually
– identique à @yearly@monthly
– Exécuter une fois par mois, « 0 0 1 * * »@weekly
– Exécuter une fois par semaine, « 0 0 * * 0 »@daily
– Exécuter une fois par jour, « 0 0 * * * »@midnight
– identique à @daily@hourly
– Exécuter une fois par heure, « 0 * * * * »
Par exemple:
@daily ramces /home/ramces/.scripts/file-backup.sh
La @reboot
shortcode vous permet de créer des scripts à exécuter au démarrage :
@reboot /home/ramces/.scripts/bootup.sh
Cela peut être extrêmement utile si vous souhaitez créer un moyen de vous assurer que les commandes sont exécutées dès que vous allumez la machine.
Noter: Selon la configuration de votre système, le @reboot
shortcode peut ou non fonctionner comme prévu dans votre système.
Crontabs système
Une autre fonctionnalité brillante de cron est qu’il peut gérer des tâches récurrentes à l’échelle du système, car vous pouvez également créer des fichiers crontab racine. Cela peut être extrêmement utile si vous souhaitez automatiser la maintenance et les mises à jour du système.
Pour créer une crontab root, il suffit d’utiliser sudo
avec la commande, ou connectez-vous à votre compte root :
La crontab système suit en grande partie le même format que la crontab de l’utilisateur. Cependant, une différence clé entre les deux est que le crontab root vous permet d’exécuter des commandes en tant qu’utilisateur du système :
m h d mon dow user [flags] "command"
Sachant cela, vous pouvez ensuite l’utiliser pour créer des commandes récurrentes au niveau de l’utilisateur et de la racine dans la même crontab :
30 2 * * sun root /bin/apt update 30 5 * * * ramces /home/ramces/.scripts/file-backup.sh
Le faire de cette façon me permet de conserver les autorisations de mes fichiers tout en ayant un seul endroit où je peux modifier les commandes que je veux exécuter.
Modification des entrées cron en tant qu’autre utilisateur
Si au lieu d’éditer le crontab en tant qu’utilisateur root, vous souhaitez programmer le travail cron en tant qu’un autre utilisateur, c’est également possible avec le -u
drapeau.
sudo crontab -u username -e
Par exemple, pour exécuter une tâche cron en tant qu’utilisateur « www-data », utilisez la commande suivante :
sudo crontab -u www-data -e
Examen de l’activité cron
Bien que vous soyez maintenant configuré pour exécuter des commandes ou des scripts spécifiques, vous souhaiterez peut-être vous assurer qu’ils ont été exécutés. Cron est intégré au fait qu’une fois qu’une commande est exécutée, elle enverra un e-mail au propriétaire du cron. Cela peut être changé avec la variable « MAILTO ».
Ajouter [email protected]
enverra tous les rapports de travail cron à un e-mail spécifié. Cette variable se trouve généralement tout en haut de l’écran d’édition crontab. Cependant, si ce n’est pas le cas, vous pouvez ajouter la variable et cela fonctionnera comme prévu.
Plusieurs adresses e-mail peuvent être séparées par une virgule. Si vous avez besoin d’une commande différente envoyée par e-mail ailleurs, vous pouvez ajouter la commande MAILTO directement au-dessus de la commande. Les commandes après ce mailto seront envoyées par e-mail à la nouvelle adresse. Si tu pars MAILTO=
vide, les notifications seront envoyées au propriétaire de l’entrée cron.
Si vous ne souhaitez pas recevoir d’e-mails, vous pouvez également consulter les journaux cron. Sur la plupart des systèmes, l’accès aux journaux cron nécessite des autorisations de superutilisateur. Le journal cron se trouve sous « /var/log ». Le fichier cron ou syslog affichera le journal des entrées cron exécutées.
Questions fréquemment posées
Pourquoi ma commande cron s’exécute-t-elle toutes les minutes au lieu d’une fois par heure ?
C’est l’un des pièges les plus courants lors de la gestion des crontabs. Par défaut, l’ajout d’une valeur astérisque dans un code temporel signifie qu’il s’exécutera pour chaque instance possible pour cette valeur. Par exemple, une valeur de 0 12 * * *
indiquera à cron que vous souhaitez exécuter une commande une fois par jour avant midi.
Cependant, la plupart des débutants écrivent souvent le même code temporel que * 12 * * *
. L’écrire de cette façon signifie que la commande s’exécutera une fois par minute de 12h00 à 12h59. En tant que tel, il est recommandé d’écrire 0 dans le champ des minutes pour s’assurer que la commande ne s’exécute qu’une seule fois.
Existe-t-il d’autres options que je peux utiliser avec cron ?
À part -n
et MAILTO
variables, vous pouvez également utiliser les -s
commande pour indiquer au programme d’être strict avec les commandes en cours d’exécution. L’utilisation de cette option forcera cron à se concentrer uniquement sur la commande en cours jusqu’à ce qu’elle se termine. Cela peut être extrêmement utile si votre machine utilise un ensemble de commandes qui doivent s’exécuter dans un ordre spécifique.
Vous pouvez également utiliser le SHELL
variable pour que cron utilise un shell différent pour ses commandes. Par exemple: SHELL=/bin/ksh