Tutorial

Comment utiliser Cron pour automatiser les tâches sur CentOS 8

CentOSSystem ToolsAutomated SetupsCentOS 8

Une version précédente de ce tutoriel a été rédigée par Shaun Lewis.

Introduction

Cron est un démon d'ordonnancement de tâches basé sur le temps que l'on trouve dans les systèmes d'exploitation de type Unix, y compris les distributions Linux. Cron fonctionne en arrière-plan et les tâches programmées avec cron, appelées “cron jobs”, sont exécutées automatiquement, ce qui rend cron utile pour automatiser les tâches liées à la maintenance.

Ce guide donne un aperçu de la façon de planifier les tâches en utilisant la syntaxe spéciale de cron. Il passe également en revue quelques raccourcis que l'on peut utiliser pour rendre les plannings de jobs plus faciles à rédiger et à comprendre.

Conditions préalables

Pour suivre ce guide, vous aurez besoin d'un accès à un ordinateur fonctionnant avec CentOS 8. Ce pourrait être votre machine locale, une machine virtuelle, ou un serveur privé virtuel.

Quel que soit le type d'ordinateur que vous utilisez pour suivre ce guide, il doit avoir un utilisateur non root avec des privilèges administratifs configurés. Pour le mettre en place, suivez notre Guide de configuration initiale du serveur pour CentOS 8.

Installation de Cron

Presque toutes les distributions Linux comprennent une forme de cron installé par défaut. Cependant, si vous utilisez une machine CentOS sur laquelle cron n'est pas installé, vous pouvez l'installer en utilisant dnf.

Avant d'installer cron sur une machine CentOS, mettez à jour l'index de package local de l'ordinateur :

  • sudo dnf update

Ensuite, installez le démon cron avec la commande suivante :

  • sudo dnf install crontabs

Cette commande vous invite à confirmer que vous souhaitez installer le package crontabs et ses dépendances. Pour cela, appuyez sur y, puis sur ENTER.

Cela va installer cron sur votre système, mais vous devrez lancer le démon manuellement. Vous devrez également vous assurer qu'il est paramétré pour s'exécuter chaque fois que le serveur se lance. Vous pouvez exécuter ces deux actions avec la commande systemctl.

Pour lancer le démon cron, exécutez la commande suivante :

  • sudo systemctl start crond.service

Pour configurer cron pour s'exécuter chaque fois que le serveur se lance, tapez :

  • sudo systemctl enable crond.service

Ensuite, cron sera installé sur votre système et sera prêt à lancer l'ordonnancement de travaux.

Comprendre comment Cron fonctionne

Les Cron jobs sont enregistrés et gérés dans un fichier spécial appelé crontab. Chaque profil d'utilisateur du système peut avoir son propre crontab où il peut programmer des jobs, il est stocké sous /var/spool/cron/.

Pour programmer un travail, il suffit d'ouvrir votre crontab pour l'éditer et d'ajouter une tâche écrite sous la forme d'une expression cron. La syntaxe pour les expressions cron peut être décomposée en deux éléments : l'ordonnancement et la commande à exécuter.

La commande peut être pratiquement n'importe quelle commande que vous exécuteriez normalement sur la ligne de commande. Le composant ordonnancement de la syntaxe est décomposé en 5 champs différents, qui sont écrits dans l'ordre suivant :

Champ Valeurs autorisées
minute 0-59
heure 0-23
Jour du mois 1-31
mois 1-12 ou JAN-DEC
Jour de la semaine 0-6 ou DIM-SAM

Ensemble, les tâches programmées dans un crontab sont structurées comme ceci :

minute hour day_of_month month day_of_week command_to_run

Voici un exemple fonctionnel d'expression cron. Cette expression exécute la commande curl http://www.google.com chaque mardi à 5h30 :

30 17 * * 2 curl http://www.google.com

Il existe également quelques caractères spéciaux que vous pouvez inclure dans la composante horaire d'une expression cron pour faciliter l'ordonnancement :

  • * : dans les expressions cron, un astérisque est une variable joker qui représente “tous”. Ainsi, une tâche programmée avec * * * * *... s'exécutera chaque minute de chaque heure de chaque jour de chaque mois.
  • , : les virgules décomposent les valeurs de l'ordonnancement pour former une liste. Si vous souhaitez qu'une tâche soit exécutée au début et au milieu de chaque heure, plutôt que d'écrire deux tâches distinctes (par exemple, ​​​​​0 * * * * ...​​​​​​ et ​​​​​​30 * * * * ...​​​​​​), vous pourriez obtenir la même fonctionnalité avec une seule (0,30 * * * * ...).
  • - : un trait d'union représente une gamme de valeurs dans le champ de l'ordonnancement. Au lieu d'avoir 30 tâches distinctes programmées pour une commande que vous voulez exécuter pendant les 30 premières minutes de chaque heure (comme dans 0 * * * * ..., 1 * * * * ..., 2 * * * * ..., et ainsi de suite),  vous pourriez simplement le programmer comme 0-29 * * * * ....
  • / : vous pouvez utiliser un slash avant avec un astérisque pour exprimer une valeur de pas. Par exemple, au lieu de rédiger huit tâches cron distinctes pour exécuter une commande toutes les trois heures (comme, 0 0 * * * ..., 0 3 * * * ..., 0 6 * * * ..., et ainsi de suite), vous pourriez le programmer pour qu'il s'exécute comme ceci : 0 */3 * * * ....

Remarque : vous ne pouvez pas exprimer des valeurs d'étape arbitrairement ; vous pouvez seulement utiliser des entiers qui se divisent de manière égale dans la plage autorisée par le champ en question. Par exemple, dans le champ “heures” vous ne pouvez faire suivre un slash avant seulement avec 1, 2, 3, 4, 6, 8, ou 12.

Voici quelques exemples de la manière d'utiliser le composant d'ordonnancement de cron :

  • * * * * * - exécute la commande chaque minute.
  • 12 * * * * - exécute la commande 12 minutes après chaque heure.
  • 0,15,30,45 * * * * - exécute la commande toute les 15 minutes.
  • */15 * * * * - exécute la commande toute les 15 minutes.
  • 0 4 * * * - exécute la commande chaque jour à 4h00.
  • 0 4 * 2-4 - exécute la commande chaque mardi, mercredi et jeudi à 4h00.
  • 20,40 */8 * 7-12 * - Exécute la commande à la 20e et à la 40e minute de chaque 8e heure tous les jours des 6 derniers mois de l'année.

Si vous trouvez tout cela déroutant ou si vous souhaitez de l'aide pour écrire des ordonnancements pour vos propres tâches cron, Cronitor fournit un éditeur pratique d'expressions des ordonnancements cron appelé “Crontab Guru” que vous pouvez utiliser pour vérifier si vos ordonnancements cron sont valides.

Gestion de Crontabs

Une fois que vous avez établi un calendrier et que vous savez quel job vous voulez exécuter, vous devrez le mettre dans un endroit où votre démon pourra le lire.

Comme mentionné précédemment, un crontab est un fichier spécial qui contient le calendrier des jobs que le cron va exécuter. Cependant, ils ne sont pas destinés à être édités directement. Il est plutôt recommandé d'utiliser la commande crontab. Cela vous permet de modifier le crontab de votre profil d'utilisateur sans changer vos privilèges avec sudo. La commande crontab vous permettra également de savoir si vous avez des erreurs de syntaxe dans le crontab, alors que l'éditer directement ne le fera pas.

Vous pouvez modifier votre crontab avec la commande suivante :

  • crontab -e

Cela va ouvrir votre crontab dans l'éditeur de texte par défaut de votre profil d'utilisateur.

Remarque : sur les nouveaux serveurs CentOS 8, la commande crontab -e ouvrira le crontab de votre utilisateur avec vi par défaut. vi est un éditeur de texte extrêmement puissant et souple, mais il peut s'avérer un peu rebarbartif pour les utilisateurs qui n'en ont pas l'expérience.

Si vous souhaitez utiliser un éditeur de texte plus facile en tant qu'éditeur crontab par défaut, vous pourriez installer et configurer nano en tant que tel.

Pour ce faire, installez nano avec dnf :

  • sudo dnf install nano

Lorsque vous y êtes invité, appuyez sur y et ensuite sur ENTER pour confirmer que vous souhaitez installer nano.

Pour configurer nano comme éditeur visuel par défaut de votre profil d'utilisateur, ouvrez le fichier .bash_profile pour édition. Maintenant que vous l'avez installé, vous pouvez procéder comme suit avec nano :

  • nano ~/.bash_profile

Au bas du fichier, ajoutez la ligne suivante :

~/.bash_profile
. . .
export VISUAL="nano"

Cela définit la variable d'environnement VISUAL sur nano. VISUAL est une variable d'environnement Unix que de nombreux programmes - y compris crontab - invoquent pour modifier un fichier. Après avoir ajouté cette ligne, enregistrez et fermez le fichier en pressant CTRL+X, Y, puis ENTER.

Rechargez ensuite le fichier .bash_profile pour que le shell prenne en compte le nouveau changement

  • . ~/.bash_profile

Une fois dans l'éditeur, vous pouvez saisir votre planning avec chaque job sur une nouvelle ligne. Sinon, vous pouvez enregistrer et fermer le crontab pour l'instant. Si vous avez ouvert votre crontab avec vi, l'éditeur de texte par défaut de CentOS 8, vous pouvez le faire en pressant ESC pour vous assurer que vous êtes dans le mode de commande vi, puis tapez :x et appuyez sur ENTER.

Notez que, sur les systèmes Linux, il y a un autre crontab stocké sous le répertoire /etc/ Il s'agit d'un crontab à l'échelle du système qui comporte un champ supplémentaire pour le profil de l'utilisateur sous lequel chaque cron job doit être exécuté. Ce tutoriel se concentre sur les crontabs spécifiques à l'utilisateur, mais si vous souhaitez modifier le crontab à l'échelle du système, vous pourriez le faire avec la commande suivante :

  • sudo nano /etc/crontab

Si vous souhaitez consulter le contenu de votre crontab, mais pas l'éditer, vous pouvez utiliser la commande suivante :

  • crontab -l

Vous pouvez effacer votre crontab avec la commande suivante :

Attention : la commande suivante ne vous demandera pas de confirmer que vous souhaitez effacer votre crontab. Exécutez-la uniquement si vous êtes certain que vous souhaitez l'effacer.

  • crontab -r

Cette commande supprime immédiatement le crontab de l'utilisateur. Cependant, vous pouvez inclure le drapeau -i pour recevoir une invite de commande vous demandant de confirmer que vous souhaitez réellement supprimer le crontab de l'utilisateur :

  • crontab -r -i
Output
crontab: really delete sammy's crontab?

Lorsque vous y êtes invité, vous devez entrer y pour supprimer le crontab ou n pour annuler la suppression.

Gestion de la production de jobs de Cron

Les cron jobs étant exécutés en arrière-plan, il n'est pas toujours évident qu'ils aient été exécuté avec succès. Maintenant que vous savez comment utiliser la commande crontab et comment programmer une tâche cron, vous pouvez commencer à expérimenter différentes façons de rediriger la sortie des tâches cron pour vous aider à vérifier qu'elles ont été exécutées avec succès.

Si vous avez mail transfer agent - comme Sendmail - installé et configuré correctement sur votre serveur, vous pouvez envoyer la sortie des tâches cron à l'adresse de courrier associée à votre profil d'utilisateur Linux. Vous pouvez également spécifier manuellement une adresse de courriel en fournissant un paramètre MAILTO en haut du crontab.

Vous pourriez par exemple ajouter les lignes suivantes à un crontab. Celles-ci comprennent une déclaration MAILTO suivie d'un exemple d'adresse électronique, une directive SHELL qui indique le shell à exécuter (bash dans cet exemple), une directive HOME pointant vers le chemin dans lequel rechercher le binaire cron, et une tâche cron unique :

. . .

MAILTO="example@digitalocean.com"
SHELL=/bin/bash
HOME=/

* * * * * echo ‘Run this command every minute’

Ce job particulier renvoie “Exécuter cette commande chaque minute” et cette sortie sera envoyée par corriel chaque minute vers l'adresse de courrier spécifiée dans la directive MAILTO.

Vous pouvez également rediriger la sortie d'une tâche cron dans un fichier journal ou dans un emplacement vide pour éviter de recevoir un courriel avec la sortie.

Pour ajouter la sortie d'une commande programmée à un fichier journal, ajoutez >> à la fin de la commande, suivi du nom et de l'emplacement d'un fichier journal de votre choix, comme ceci :

* * * * * echo ‘Run this command every minute’ >> /directory/path/file.log

Supposons que vous vouliez utiliser cron pour exécuter un script mais qu'il reste en arrière-plan. Pour ce faire, vous pouvez rediriger la sortie du script vers un emplacement vide, comme /dev/null qui efface immédiatement toutes les données qui y sont écrites. Par exemple, la tâche cron suivante exécute un script PHP et le lance en arrière-plan :

* * * * * /usr/bin/php /var/www/domain.com/backup.php > /dev/null 2>&1

Ce job cron redirige également l'erreur standard - représentée par 2 - vers la sortie standard (>&1). Parce que la sortie standard est déjà redirigée vers /dev/null, cela permet essentiellement au scénario de se dérouler en silence. Même si le crontab contient une déclaration MAILTO, la sortie de la commande ne sera pas envoyée à l'adresse de courriel spécifiée.

Restriction de l'accès

Vous pouvez gérer quels utilisateurs sont autorisés à utiliser la commande crontab avec les fichiers cron.allow et cron.deny, qui sont tous les deux stockés dans le répertoire /etc/ Si le fichier cron.deny existe, n'importe quel utilisateur listé dans celui-ci se verra interdire de modifier son crontab. Si cron.allow existe, seuls les utilisateurs listés dans celui-ci pourront modifier leurs crontabs. Si les deux fichiers existent et que le même utilisateur est listé dans chacun de ces fichiers, le fichier cron.allow aura la préséance sur cron.deny et l'utilisateur pourra modifier son crontab.

Par exemple, pour refuser l'accès à tous les utilisateurs et donner ensuite accès à l'utilisateur ishmael, vous pourriez utiliser la séquence de commande suivante :

  • sudo echo ALL >>/etc/cron.deny
  • sudo echo ishmael >>/etc/cron.allow

Tout d'abord, nous verrouillons tous les utilisateurs en ajoutant TOUS au fichier cron.deny. Ensuite, en ajoutant le nom d'utilisateur au fichier cron.allow, nous donnons au profil utilisateur d’ishmael l'accès pour exécuter les tâches cron.

Notez que si un utilisateur a des privilèges sudo, il peut modifier le crontab d'un autre utilisateur avec la commande suivante :

  • sudo crontab -u user -e

Cependant, si cron.deny existe, que user est listé dans celui-ci et qu'il n'est pas listé dans cron.allow, vous recevrez l'erreur suivante après avoir exécuté la commande précédente :

Output
The user user cannot use this program (crontab)

Par défaut, la plupart des démons cron supposeront que tous les utilisateurs ont accès à cron, sauf si cron.allow ou cron.deny existent.

Syntaxe spéciale

Il existe également plusieurs commandes abrégées que vous pouvez utiliser dans votre fichier crontab pour simplifier l'ordonnancement des jobs. Il s'agit essentiellement de raccourcis pour l'ordonnancement numérique équivalent spécifié :

Raccourci Abréviation pour
@hourly 0 * * * *
@daily 0 0 * * *
@weekly 0 0 * * 0
@monthly 0 0 1 * *
@yearly 0 0 1 1 *

Remarque : tous les démons cron ne peuvent pas analyser cette syntaxe (en particulier les anciennes versions), donc vérifiez qu'elle fonctionne avant de vous y fier.

De plus, l'abréviation @reboot exécutera toute commande qui la suit à chaque démarrage du serveur :

@reboot echo "System start up"

L'utilisation de ces raccourcis chaque fois que cela est possible peut faciliter l'interprétation de l'ordonnancement des tâches dans votre crontab.

Conclusion

Cron est un utilitaire souple et puissant qui peut réduire la charge de nombreuses tâches associées à l'administration des systèmes. Combiné à des scripts shell, il permet d'automatiser des tâches qui sont normalement fastidieuses ou compliquées.

Creative Commons License