Guide d'utilisation de Cron

Eric Brown  Auteur
Xavier Neys  Correcteur
Joshua Saddler  Correcteur
Camille Huot  Traducteur

Dernière mise à jour le 26 janvier 2008

1.  Cron, la base

À quoi sert cron ?

Cron est un démon qui lance des tâches qui ont été planifiées à l'aide de la commande crontab. Pour cela, il se réveille à chaque minute pour vérifier s'il n'y a pas une tâche à lancer en regardant les crontabs des utilisateurs.

Note : Notez que crontab est à la fois le nom de la liste d'applications à lancer et le nom de la commande qui permet d'éditer cette même liste.

Plusieurs implémentations

Il existe plusieurs implémentations de cron dans Portage, parmi lesquelles vous devrez en choisir une à installer. Toutes les implémentations offrent une interface similaire, appelée crontab. Il existe également un outil appelé Anacron qui permet de travailler avec cron sur les systèmes qui ne sont pas allumés en permanence.

Il est également important de noter que chacun des paquets cron dépend de sys-process/cronbase. Ce paquet n'est pas techniquement requis par les implémentations de cron, mais apportent des fonctionnalités supplémentaires que la plupart des utilisateurs apprécieront.

Avant de commencer à travailler avec cron, vous devez choisir quelle implémentation vous voulez utiliser. Pour vous permettre de faire le choix adéquat, le chapitre suivant contient des informations sur chacune d'entre elles.

2.  Quel est le meilleur cron pour vous ?

Vixie Cron

Vixie Cron est une implémentation complète de cron basée sur SysV cron. Chaque utilisateur possède sa propre crontab et peut y spécifier des variables d'environnement. À la différence des autres variantes de cron, il supporte SELinux et PAM. Il supporte moins d'architectures que Dcron mais plus que Fcron.

Voici les fonctionnalités de sys-process/vixie-cron :

Dillon's Cron

Dcron est une implémentation simple, élégante et sûre de cron. Il ne permet pas de spécifier des variables d'environnement dans les crontabs et toutes les tâches sont lancées avec /bin/sh. Comme dans Vixie Cron, chaque utilisateur possède son propre crontab.

Voici les fonctionnalités de sys-process/dcron :

Fcron

Le but de Fcron est de remplacer Vixie Cron et Anacron. Il est conçu pour fonctionner sur des systèmes qui ne sont pas en marche en permanence et il possède des fonctionnalités avancées. Il sait gérer les contraintes de démarrage des tâches, les contrôles de mise en série des tâches, la possibilité de spécifier des valeurs pour nice et la possibilité de lancer des tâches au démarrage du système. Visitez le site de fcron pour plus d'informations.

Voici les fonctionnalités de sys-process/fcron :

bcron

brcron est un nouveau système cron visant à sécuriser les opérations. Pour cela, le système est divisé en plusieurs programmes distincts, chacun étant responsable d'une tâche précise, et les communications entre eux étant strictement contrôlées. L'interface utilisateur est une alternative pour les systèmes similaires (tels que vixie-cron), mais les éléments internes diffèrent grandement. Pour plus d'informations, consultez le site de bcron à http://untroubled.org/bcron/.

Fonctionnalités de sys-process/bcron:

Anacron

Anacron n'est pas un démon cron. C'est un programme qui fonctionne en collaboration avec l'un d'entre eux. Il exécute des commandes à des intervalles spécifiés en jours et ne présume pas que le système fonctionne en permanence. Il lancera les tâches qui ne l'ont pas été pendant que le système était éteint. Anacron s'utilise en général avec un démon cron pour le lancer chaque jour.

3.  Utilisation de cron

Installation

Sélectionnez l'implémentation de cron que vous préférez, puis installez-la.

Exemple de code 3.1 : Installer cron

# emerge dcron
# /etc/init.d/dcron start
# rc-update add dcron default

Si vous n'avez pas installé Fcron, vous pouvez éventuellement installer Anacron.

Exemple de code 3.2 : Installer anacron

# emerge anacron
# /etc/init.d/anacron start
# rc-update add anacron default

Le crontab du système

À la fin de l'installation, certains des paquets cron vous demandent de lancer la commande crontab /etc/crontab. Le fichier /etc/crontab est le crontab de votre système. Une installation de cron peut l'utiliser avec sys-process/cronbase pour lancer les scripts situés dans /etc/cron.{daily,hourly,weekly,monthly}. Notez que seul Vixie Cron planifie automatiquement les tâches situées dans /etc/crontab. Les utilisateurs de Dcron et Fcron devront lancer crontab /etc/crontab à chaque modification du fichier /etc/crontab.

Veuillez noter que les tâches planifiées dans le crontab système ne seront pas forcément affichées dans la liste des tâches donnée par crontab -l.

Bien sûr, peut-être que vous ne voudrez pas utiliser de crontab système du tout. Dans ce cas, si vous utilisez Dcron ou Fcron, ne lancez pas crontab /etc/crontab. Si vous utilisez vixie-cron ou bcron, vous devrez commenter toutes les lignes du fichier /etc/crontab.

Exemple de code 3.3 : Commenter toutes les lignes de /etc/crontab

# sed -ie "s/^/#/" /etc/crontab

Donner l'accès à cron aux utilisateurs autorisés

Si vous voulez que d'autres utilisateurs que root aient accès au démon cron, alors lisez cette section. Sinon, vous pouvez passer directement à la section suivante, « Planifier une tâche ».

Note : Donner à un utilisateur la permission d'avoir un crontab ne lui permet pas d'exécuter des tâches en tant que root. Si vous voulez qu'un utilisateur puisse éditer le crontab de root, vous devriez penser à utiliser sudo. Vous trouverez plus de détails dans notre Guide Sudo.

Quel que soit le paquet cron utilisé, si vous voulez permettre à un utilisateur d'avoir un crontab, la première chose à faire est de l'intégrer au groupe cron. Par exemple, si vous voulez ajouter l'utilisateur wepy au groupe cron, vous taperez :

Exemple de code 3.4 : Ajouter un utilisateur au groupe cron

# gpasswd -a wepy cron

Note : Après avoir ajouté un utilisateur à un groupe, l'utilisateur en question doit se reconnecter pour que vos modifications soient prises en compte.

Si vous utilisez Dcron, c'était tout ce qu'il y avait à faire pour permettre à un utilisateur d'avoir son crontab. Les utilisateurs de Dcron peuvent maintenant passer à la section suivante « Planifier une tâche ».

Si vous utilisez Fcron, vous devrez éditer les fichiers /etc/fcron/fcron.deny et /etc/fcron/fcron.allow. La manière la plus sûre est d'abord d'interdire tout le monde dans /etc/fcron/fcron.deny, puis d'autoriser explicitement chaque utilisateur dans /etc/fcron/fcron.allow.

Important : Si ni le fichier /etc/fcron/fcron.allow, ni /etc/fcron/fcron.deny n'existent, tous les utilisateurs du groupe cron auront le droit d'utiliser crontab. Le fichier fcron.allow par défaut de fcron permet à tous les utilisateurs du groupe cron d'accéder à fcrontab.

Exemple de code 3.5 : Permissions dans fcron.deny

all

Maintenant, disons que l'utilisateur wepy devrait avoir le droit de planifier ses propres tâches. Nous l'ajoutons au fichier /etc/fcron/fcron.allow de la façon suivante :

Exemple de code 3.6 : Permissions dans fcron.allow

wepy

Si vous aviez choisi Vixie cron, vous pouvez vous contenter d'éditer le fichier /etc/cron.allow.

Important : Il est important de noter que si seul le fichier /etc/cron.allow existe, alors uniquement les utilisateurs du groupe cron qui sont listés dans ce fichier auront le droit d'avoir un crontab. Par contre, si seul un fichier /etc/cron.deny vide existe, alors tous les utilisateurs du groupe cron y auront droit. Ne laissez pas /etc/cron.deny vide si vous n'avez pas de /etc/cron.allow.

Par exemple, si vous voulez permettre l'accès à l'utilisateur wepy, vous l'ajouterez au fichier /etc/cron.allow comme suit :

Exemple de code 3.7 : Permissions dans /etc/cron.allow

wepy

Planifier une tâche

La procédure d'édition du crontab diffère d'un paquet à l'autre, mais ils supportent tous le même ensemble de commandes de base : ajouter et remplacer des crontabs, éditer des crontabs, supprimer des crontabs et lister les tâches des crontabs. La liste suivante vous montre comment procéder pour chaque paquet.

Version Éditer le crontab Supprimer le crontab Nouveau crontab Lister le crontab
dcron crontab -e crontab -d [user] crontab fichier crontab -l
fcron fcrontab -e fcrontab -r [user] fcrontab fichier fcrontab -l
vixie-cron & bcron crontab -e crontab -r -u [utilisateur] crontab fichier crontab -l

Note : Si vous ne spécifiez pas d'utilisateur pour supprimer le crontab, il supprimera celle de l'utilisateur courant.

Note : Fcron fait un lien symbolique de crontab vers fcrontab.

Avant de pouvoir utiliser ces commandes, vous devez d'abord comprendre comment fonctionne le crontab elle-même. Chaque ligne d'une crontab doit spécifier cinq champs temporels dans l'ordre suivant : les minutes (0-59), les heures (0-59), les jours du mois (1-31), les mois (1-12) et les jours de la semaine (0-7, lundi étant 1 et dimanche étant 0 ou 7). Les jours de la semaine et les mois peuvent être spécifiés en utilisant leur abréviation anglaise : mon, tue, jan, feb, etc. Chaque champ peut aussi contenir un intervalle de valeurs (par exemple : 1-5 ou mon-fri), une liste de valeurs séparées par une virgule ou un intervalle de valeurs avec un pas associé (par exemple 1-6/2 est équivalent à 1,3,5).

Cela doit vous paraître un peu déroutant, mais, avec quelques exemples, vous verrez que ce n'est pas si compliqué.

Exemple de code 3.8 : Exemples

# Lance /bin/false à chaque minute, toute l'année
*     *     *     *     *        /bin/false

# Lance /bin/false du lundi au mercredi et le 4 de chaque mois, à 1h35
35    1     4     *     mon-wed  /bin/false

# Lance /bin/true le 2 mars à 22h25
25    22    2     3     *        /bin/true

# Lance /bin/false chaque lundi, mercredi et vendredi, à 2h
0     2     *     *     1-5/2    /bin/false

Note : Remarquez bien que vous devez spécifier les jours de la semaine et les jours du mois pour qu'ils soient combinés. Si vous mettez * pour l'un des deux champs, uniquement l'autre sera pris en compte. Enfin, si vous mettez * pour les deux, la tâche sera exécutée tous les jours.

Pour tester tout ce que vous venez d'apprendre, franchissons le pas et ajoutons quelques tâches planifiées. Premièrement, créez un fichier nommé crons.cron et faites-le ressembler à ceci :

Exemple de code 3.9 : Éditer crons.cron

# nano crons.cron
#Min.  Heures Jours  Mois    JourSemaine
10     3      1      1       *       /bin/echo "je n'aime pas vraiment cron"
30     16     *      1,2     *       /bin/echo "j'aime un peu cron"
*      *      *      1-12/2  *       /bin/echo "cron c'est de la balle !"

Nous pouvons maintenant ajouter ce crontab au système grâce à la « commande de création » que nous avons vue précédemment.

Exemple de code 3.10 : Un nouveau crontab

# crontab crons.cron

Note : Vous ne verrez pas les sorties des « echo » que nous avons programmés tant que vous n'utiliserez pas de redirection.

Pour vérifier que les tâches ont été correctement prises en compte, nous utiliserons la « commande pour lister ».

Exemple de code 3.11 : Lister les tâches planifiées

# crontab -l

Vous devriez voir quelque chose qui ressemble fortement au fichier crons.cron. Si ce n'est pas le cas, vous avez peut-être utilisé une mauvaise commande pour entrer les tâches.

Ce crontab doit afficher « cron c'est de la balle ! » à chaque minute de chaque heure de chaque jour de chaque mois impair. Évidemment, vous n'avez à faire ceci que si vous aimez vraiment cron. Le crontab fera également afficher « j'aime un peu cron » chaque jour de janvier et février à 16h30 et « je n'aime pas vraiment cron » le premier janvier à 3h10.

Si vous utilisez Anacron, continuez à lire cette section. Sinon, vous pouvez passer à la section suivante, « Éditer le crontab ».

Les utilisateurs d'Anacron doivent aussi éditer le fichier /etc/anacrontab. Ce fichier possède quatre champs : le nombre de jours entre chaque lancement, le délai en minutes à imposer après son lancement, le nom de la tâche et la commande à lancer.

Par exemple, pour qu'il lance la commande echo "j'aime anacron" tous les cinq jours, dix minutes après qu'Anacron soit démarré, vous mettriez :

Exemple de code 3.12 : /etc/anacrontab

5 10 perte-de-temps /bin/echo "j'aime anacron"

Anacron se termine une fois que toutes les tâches de l'anacrontab ont été exécutées. Ainsi, si nous voulons qu'il vérifie les tâches à exécuter tous les jours, nous devons utiliser cron. Les instructions à la fin de la section suivante vous indiqueront comment faire.

Éditer le crontab

À présent, soyons un peu réalistes. Vous n'avez certainement pas besoin que votre système vous rappelle chaque minute à quel point vous aimez cron. Afin d'avancer, nous allons enlever ce crontab en utilisant la « commande de suppression » vue précédemment et nous listerons ensuite les tâches pour nous assurez que cela a marché.

Exemple de code 3.13 : Supprimer et lister le crontab

# crontab -d
# crontab -l

Vous ne devriez pas voir de tâche listée par crontab -l. Si ce n'est pas le cas, c'est que nous n'avons pas réussi à retirer le crontab. Assurez-vous d'avoir utilisé la bonne « commande de suppression » appropriée pour votre paquet.

Maintenant que tout est propre, mettons quelque chose d'utile dans le crontab de root. La plupart des gens voudraient lancer updatedb hebdomadairement pour être s'assurer que slocate fonctionne correctement. Pour ajouter ça à votre crontab, commencez par ouvrir le fichier crons.cron et faites-le ressembler à ceci :

Exemple de code 3.14 : Un vrai crontab

22 2 * * 1    /usr/bin/updatedb

Cela aura pour effet de lancer updatedb tous les lundis matins à 2h22. Insérons maintenant ce crontab avec la « commande de création » vue précédemment et vérifions notre travail.

Exemple de code 3.15 : Lister les tâches cron

# crontab crons.cron
# crontab -l

Maintenant, disons que vous voulez aussi ajouter emerge --sync à la liste de vos tâches quotidiennes. Vous pouvez faire cela en éditant crons.cron puis en faisant crontab crons.cron comme nous l'avons fait précédemment, mais vous pouvez également utiliser la « commande d'édition » appropriée vue dans le tableau plus haut. Cela vous donne la possibilité d'éditer le crontab de votre utilisateur sans devoir utiliser un fichier externe comme crons.cron.

Exemple de code 3.16 : Éditer directement un crontab

# crontab -e

Cela devrait ouvrir votre crontab dans un éditeur de texte. Nous voulons lancer emerge --sync tous les jours à 6h30 du matin ; voici ce que cela donnerait :

Exemple de code 3.17 : Une vraie crontab

22 2 * * 1    /usr/bin/updatedb
30 6 * * *    /usr/bin/emerge --sync
(Si vous utilisez anacron, ajoutez cette ligne :)
30 7 * * *    /usr/sbin/anacron -s

Encore une fois, vérifiez la liste des tâches cron, comme nous l'avons fait dans les exemples précédents, afin de vous assurer que tout est correct.

4.  Utiliser cronbase

Comme nous l'avons mentionné plus haut, tous les paquets cron disponibles dépendent de sys-process/cronbase. Le paquet cronbase crée les fichiers /etc/cron.{hourly,daily,weekly,monthly} ainsi qu'un script appelé run-crons. Vous noterez que le crontab système par défaut (/etc/crontab) contient ces lignes :

Exemple de code 4.1 : Crontab système par défaut

*/15 * * * *     test -x /usr/sbin/run-crons && /usr/sbin/run-crons
0  *  * * *      rm -f /var/spool/cron/lastrun/cron.hourly
0  3  * * *      rm -f /var/spool/cron/lastrun/cron.daily
15 4  * * 6      rm -f /var/spool/cron/lastrun/cron.weekly
30 5  1 * *      rm -f /var/spool/cron/lastrun/cron.monthly

Pour éviter de rentrer trop dans les détails, acceptons le fait que ces commandes permettront l'exécution de vos scripts mensuels, hebdomadaires, etc. Cette manière de planifier des tâches comporte certains avantages :

Note : Encore une fois, nous rappelons que Vixie Cron et bcron lisent automatiquement /etc/crontab, ce qui n'est pas le cas de dcron et fcron. Veuillez vous reporter à la section « Le crontab du système » pour en lire plus à ce sujet.

5.  Pour finir

Problèmes

Si vous avez du mal à faire marcher cron correctement, vous serez certainement intéressé par cette liste de vérifications :

Souvenez-vous que chaque paquet cron est différent et que les fonctionnalités proposées varient énormément de l'un à l'autre. Assurez-vous d'avoir lu les pages de manuel de crontab, fcrontab ou anacron, selon ce que vous utilisez.

Bonne chance !