Crontab: le planificateur de tâches périodiques
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 :
- minutes (0-59)
- heure (0-23)
- jour du mois (1-31)
- mois de l’année (0-12)
- jour de la semaine (0-7 avec 0 et 7 pour dimanche)
- 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.
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
/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