Logo linux

Crontab: le planificateur de tâches périodiques

crontab


Crontab, ou plus familièrement cron, est un petit utilitaire installé par défaut dans les distributions courantes. Il vous permet de planifier l’exécution d’un programme ou d’une commande de manière périodique et en arrière plan.

Crontab peut être utilisé de différentes manières. Dans le cadre privé, vous pouvez imaginer programmer un rappel des dates anniversaires, un mail journalier contenant votre IP public et plein d’autres choses. Dans le cadre professionnel, il peut être utilisé pour programmer des sauvegardes régulières, vérifier des données, générer des rapports ou tout autre choses dont vous pouvez avoir besoin de manière régulière.

Comment modifier vos crons

Pour ajouter une tâche à votre crontab vous devez utiliser la commande suivante :

$ crontab -e

Crontab utilisera alors l’éditeur défini dans la variable EDITOR, si aucun éditeur n’est défini il utilisera /usr/bin/editor (pour ma part il s’agit de vim mais vous pouvez utiliser n’importe quel éditeur y compris nano)

Le format du fichier est le suivant :

# m h dom mon dow command
00 03 * * * /data/tools/dump-perhonen

Dans cet exemple, le script /data/tools/dump-perhonen sera exécuté tous les jours à 3:00 (heure du PC sur lequel est exécuté le script). Ce script sera exécuté avec les droits de l’utilisateur à qui appartient le crontab.

La syntaxe :

  • une instruction par ligne et chaque ligne doit finir par \n
  • La commande ne doit pas dépasser 998 caractères.
  • Vous devez séparer chaque champ par au moins un espace ou une tabulation.
  • Les champs sont les suivants dans l’ordre :
    1. minutes (0-59)
    2. heure (0-23)
    3. jour du mois (1-31)
    4. mois de l’année (0-12)
    5. jour de la semaine (0-7 avec 0 et 7 pour dimanche)
    6. la commande à exécuter

Les champs de choix de la date peuvent contenir :

  • * (un astérisque) qui correspond à tout l’intervalle
  • 1-10 (un intervalle) permet la sélection d’une tranche dans le cas présent de 1 à 10
  • 0,4,9,12,15 (une sélection) permet de spécifier certaines valeurs
  • */3 ou 1-10/3 (un pas) permet de spécifier un pas, dans le cas présent un pas de 3.

Exemple :

# Exécuter à 0h03 tous les jours
3 0 * * *         $HOME/bin/daily.job
# Exécuter le premier jour du mois à 0h03.
3 0 1 * *         $HOME/bin/monthly.job
# Exécuter le 28 juillet à 12h01 tous les ans.
1 12 28 7 *       echo 'Happy birthday'
# Exécuter à 0h01 du 1-15 de chaque mois.
1 0 1-15 * *      echo 'Stationnement coté impaire'
# Exécuter à 7h00 du lundi au vendredi.
0 7 * * 1-5       echo 'Réveille-toi'
# Exécuter toutes les 2 heures du lundi au vendredi de 8h00 à 18h00.
0 8-18/2 * * 1-5  echo 'Faire une pause de 10 min'
# Exécuter à 12h00 le 13 de chaque mois et chaque vendredi.
0 12 13 * 5       echo 'Es ce un vendredi 13 ?'

Lorsque vous spécifiez le jour du mois et le jour de la semaine, la commande est exécutée lorsque l’un est vrai. Le dernier exemple sera donc exécuté le 13 de chaque mois mais aussi chaque vendredi. Pour exécuter une commande uniquement les vendredi 13, l’instruction aurait du être la suivante :

0 12 13 * *       test $(date +\%u) -eq 5 && echo 'Jouer au loto'

Gestion des droits à crontab

Comme je vous le disais précédemment, chaque utilisateur a possibilité d’avoir son crontab. C’est la configuration par défaut. Mais il est possible de restreindre ces droits grâce à 2 fichiers. Les fichiers /etc/cron.allow et /etc/cron.deny permettent de spécifier respectivement qui a le droit et qui n’a pas le droit d’utiliser cron. Si le fichier cron.allow existe alors crontab ne regardera pas le fichier cron.deny. Ces fichiers sont consultés au moment des changements de taches via la commande crontab.

Le fichier /etc/cron.allow vous permet de spécifier quels utilisateurs ont le droit de modifier leur crontab tandis que le fichier /etc/cron.deny interdit la modification aux utilisateurs listés.

Je précise bien que seul la modification est bloqué. Les instructions déjà enregistrées continueront à être exécutées.

La syntaxe des fichiers de gestion des droits est la suivante. Vous devez mettre un nom d’utilisateur par ligne.

# vi /etc/cron.allow
toto
titi
ATTENTION: la seule présence du fichier /etc/cron.allow vide interdit la modification des crons à tous les utilisateurs y compris root.

Les variables d’environnement

Les variables d’environnement peuvent être définies et redéfinies tout au long de votre crontab. La définition d’une de ces variables n’influera que sur les instructions suivant sa déclaration.

SHELL

Le shell par défaut définit dans crontab est /bin/sh, c’est le shell minimal. Dans certains cas vous pouvez avoir besoin de fonctionnalités spécifique à un autre shell. Pour redéfinir le shell ajoutez l’instruction suivante à votre crontab :

SHELL = /bin/bash

PATH

Vous pouvez vouloir exécuter des exécutables provenant de /usr/local/bin sans avoir à spécifier, tout le temps, le chemin complet. Pour cela vous devez définir un nouveau path. Le path définit par défaut est /usr/bin:/bin. Sa redéfinition se fait via l’instruction suivante :

PATH = /usr/bin:/bin:/usr/local/bin:~/bin

La définition précédente ajoute /usr/local/bin ainsi que $HOME/bin au path par défaut.

Attention, la substitution de variable ne fonctionne pas au sein des crontab, ne faites donc pas :

PATH:$PATH:/usr/local/bin

MAILTO

La variable MAILTO définit à qui doit être envoyé le résultat des commandes exécutées ensuite. Par défaut le résultat des commandes est envoyé à l’utilisateur local propriétaire du crontab. Le fichier crontab étant examiné du début à la fin, vous pouvez définir plusieurs fois MAILTO en fonction des résultats désirés.

# m h dom mon dow command
21 10 * * * echo 'résultat envoyé au mail local de l\'utilisateur'

MAILTO = toto@example.com,titi@example.com
21 10 * * * echo 'résultat envoyé à titi et toto du domaine example.com'

MAILTO = ""
21 10 * * * echo 'aucun mail ne sera envoyé'

Sauvegarde et restauration de vos crons

Dans certains cas, il peut s’avérer utile de sauvegarder vos instructions crontab au cas ou … mais aussi lorsque vous avez besoin de le dupliquer sur différents systèmes notamment dans le cadre de déploiement d’application reposant grandement sur crontab.

La sauvegarde du crontab se fait simplement via la commande suivante :

# crontab -u toto -l > newtoto.crontab

Sur cette commande j’ai ajouté l’option -u toto pour demander à crontab de me renvoyer celui de l’utilisateur toto. Lorsque vous sauvegardez votre crontab vous n’avez pas besoin de cette option.

La restauration sur l’utilisateur titi se fait tout aussi simplement.

# crontab -u titi newtoto.crontab

Vous pouvez aussi choisir de supprimer complètement l’ensemble des instructions de l’utilisateur toto via la commande suivante :

# crontab -u toto -r

Et sinon

Sinon il existe aussi incrontab qui est l’équivalent de crontab au niveau du système de fichier. Il vous permet d’exécuter des instructions non plus en fonction de la date et l’heure mais en fonction des évènements survenus sur votre système de fichier : création, déplacement, suppression ou encore accès à un fichier dans un répertoire spécifier.

Sources:

$ man 5 crontab

Laisser un commentaire

Votre adresse de messagerie 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 comment les données de vos commentaires sont utilisées.