Tutorial

Comment utiliser Cron pour automatiser les tâches sur Ubuntu 18.04

System ToolsUbuntu 18.04

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 terminer ce guide, vous devez avoir accès à un ordinateur fonctionnant sous Ubuntu 18.04. Cela 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 configurer, suivez notre guide de configuration initiale du serveur pour Ubuntu 18.04.

Installation de Cron

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

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

  • sudo apt update

Ensuite, installez cron avec la commande suivante :

  • sudo apt install cron

Vous devrez vous assurer qu'il est configuré pour s'exécuter en arrière-plan également :

  • sudo systemctl enable cron
Output
Synchronizing state of cron.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable cron

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/crontabs.

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 à 17h30 :

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 (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 toutes les 15 minutes.
  • */15 * * * * - exécute la commande toutes 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

Si c'est la première fois que vous exécutez la commande crontab sous ce profil d'utilisateur, il va vous invite à sélectionner un éditeur de texte par défaut à utiliser pour éditer votre crontab :

Output
no crontab for sammy - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/nano <---- easiest 2. /usr/bin/vim.basic 3. /usr/bin/vim.tiny 4. /bin/ed Choose 1-4 [1]:

Entrez le numéro correspondant à l'éditeur de votre choix. Vous pouvez également appuyer sur la touche ENTER pour accepter le choix par défaut, nano.

Après avoir fait votre sélection, vous serez dirigé vers une nouvelle crontab contenant quelques instructions commentées sur la façon de l'utiliser :

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

Lorsque vous lancerez crontab -e à l'avenir, votre crontab sera automatiquement amenée dans cet éditeur de texte. 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 (CTRL+X, Y, puis ENTER si vous avez sélectionné nano).

Remarque : 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? (y/n)

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

Gestion de la sortie 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 existe.

Syntaxe spéciale

Il existe également plusieurs commandes abrégée 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. Vous pouvez par exemple écrire un scénario shell pour envoyer des sauvegardes de données à une solution de stockage d'objets, puis l'automatiser avec cron.

0 Comments

Creative Commons License