CRONTAB(5)

NOM
crontab - Tables permettant de gérer le démon cron

DESCRIPTION
Un fichier crontab contient des instructions pour le démon cron(8). Ces instructions ont la forme générale suivante : « lancer cette commande à telle heure, tel jour ». Chaque utilisateur dispose de sa propre table crontab, et les commandes contenues dans une table seront exécutées sous l'identifiant du propriétaire de la table. Les pseudo-utilisateurs Uucp et News disposent généralement de leurs propres crontabs, ce qui évite d'invoquer explicitement su(1) dans une commande cron.

Les lignes blanches, les espaces et tabulations en début de lignes sont ignorées. Les lignes dont le premier caractère non blanc est un dièse (#) sont considérées comme des commentaires, et sont également ignorées. Notez que les commentaires ne peuvent pas se trouver sur la même ligne qu'une commande cron, car ils seraient considérés comme des paramètres de la commande à invoquer. De même, un commentaire ne peut pas se trouver sur la même ligne qu'une affectation de variable d'environnement.

Une ligne active dans une crontab devra donc être soit une affectation de variable d'environnement, soit une commande cron. Le fichier crontab est analysé du début à la fin, donc les configurations d'environnement n'affecteront que les commandes cron qui les suivent dans le fichier. Une ligne d'affectation d'environnement est de la forme :

    nom = valeur

où les espaces autour du signe égal (=) sont facultatives, et où toutes les espaces ultérieures dans valeur feront partie intégrante de la valeur affectée à la variable nom. La chaîne de valeur peut être inscrite entre guillemets simples ou doubles afin de protéger les blancs initiaux et finaux. Les guillemets sont nécessaires pour définir les variables vides. La chaîne valeur ne permet pas les substitutions de variable d'environnement ou le remplacement de variables, ainsi une ligne comme

    PATH = $HOME/bin:$PATH

ne fonctionnera pas comme attendu. Tout comme ceci ne fonctionnera pas

    A=1
    B=2
    C=$A $B

Il n'y aura pas de substitution pour les variables définies dans la dernière valeur.

Une alternative à la définition du chemin des commandes est d'utiliser le fait que de nombreux interpréteurs de commandes interprètent un tilde (« ~ ») comme substitution de $HOME, ainsi si vous utilisez bash pour vos tâches, vous pouvez utiliser ceci :

     SHELL=/bin/bash
     PATH=~/bin:/usr/bin/:/bin

Plusieurs variables d'environnement sont automatiquement définies par le démon cron(8). SHELL prend la valeur « /bin/sh », LOGNAME et HOME sont définies à partir de la ligne de /etc/passwd correspondant au propriétaire de la crontab. PATH est définie à « /usr/bin:/bin ». HOME, SHELL et PATH peuvent être réaffectées explicitement dans la crontab contrairement à LOGNAME, qui est l'utilisateur ayant lancé la tâche.

(Remarque : la variable LOGNAME est parfois nommée USER sur les systèmes BSD. Sur ces systèmes, USER doit aussi être définie.)

En plus de LOGNAME, HOME, et SHELL, cron(8) prendra en compte la variable MAILTO s'il doit envoyer le résultat d'une commande exécutée depuis « cette » crontab. Si MAILTO est définie (et non vide), le résultat est envoyé à l'utilisateur indiqué. MAILTO peut aussi servir à envoyer les courriers à plusieurs destinataires en séparant les destinataires par une virgule. Si MAILTO est définie mais vide (MAILTO=""), aucun courrier ne sera envoyé. Sinon, le courrier sera envoyé au propriétaire de la crontab.

Sur les systèmes Debian GNU/Linux, cron gère le module pam_env et charge les variables d'environnement des fichiers /etc/environment et /etc/security/pam_env.conf. Les renseignements à propos des locales sont aussi lus dans /etc/default/locale. Toutefois les réglages de PAM n'affectent pas les réglages décrits ci-dessus ni la configuration dans le fichier crontab. Veuillez noter en particulier que si vous voulez un autre PATH que « /usr/bin:/bin », vous devrez le mentionner dans le fichier crontab.

Par défaut, cron envoie le courrier en utilisant l'en-tête « Content-type: text/plain » avec comme valeur du paramètre « charset= » l'encodage utilisé par crond(8) à son lancement, c'est-à-dire soit la locale par défaut du système si aucune variable d'environnement LC_* n'est attribuée, soit la locale indiquée par ces variables LC_* (voir locale(7)). Vous pouvez utiliser un autre encodage de caractères pour les messages envoyés par cron en positionnant les variables CONTENT_TYPE et CONTENT_TRANSFER_ENCODING dans vos crontabs aux valeurs souhaitées des en-têtes de message correspondants.

Le format d'une commande cron est très proche du standard V7, avec quelques options permettant de garder une compatibilité ascendante. Chaque ligne dispose de cinq champs de date et d'heure, suivis d'une commande et enfin d'un retour à la ligne (« \n »). Le système crontab (/etc/crontab) utilise le même format, si ce n'est que le champ identifiant est indiqué après les champs de date et d'heure mais avant la commande. Les champs peuvent être séparés par des espaces ou des tabulations. La taille maximale permise pour le champ de commande est de 998 caractères.

Les commandes sont exécutées par cron(8) lorsque les champs minute, heure et mois de l'année correspondent à la date actuelle, et lorsqu'au moins l'un des deux champs jour (jour du mois ou jour de la semaine) correspond au jour actuel (voir « Remarque » ci-dessous). cron(8) examine les entrées cron chaque minute. Les champs d'heure et de date sont :

    champ     valeurs autorisées
    -----     --------------
    minute     0-59
    heure     0-23
    jour du mois     1-31
    mois     1-12 (ou noms, voir ci-dessous)
    jour de semaine     0-7 (0 et 7 pour dimanche, ou utiliser les noms)

Un champ peut contenir un astérisque « * », qui correspond à l'intervalle « premier-dernier ».

Les intervalles de nombres sont permis. Ils se présentent sous forme de deux nombres séparés par un trait d'union. Les bornes sont comprises. Par exemple, l'intervalle horaire 8-11 correspond à une exécution aux heures 8, 9, 10, et 11.

Les listes sont permises. Une liste est un ensemble de nombres ou d'intervalles séparés par des virgules. Exemple « 1,2,5,9 », « 0-4,8-12 ».

Des valeurs de « pas » peuvent être associées aux intervalles. À la suite d'un intervalle, un « /nombre » précise le pas à adopter pour parcourir l'intervalle. Par exemple « 0-23/2 » dans le champ horaire demande une exécution toutes les heures paires. Une alternative avec le standard V7 serait « 0,2,4,6,8,10,12,14,16,18,20,22 »). Les pas sont également autorisés à la suite d'un astérisque. Ainsi, pour dire « toutes les deux heures », on peut utiliser « */2 ».

On peut employer le nom des mois ou des jours de la semaine (en anglais), en utilisant les trois premières lettres (pas de différence majuscule/minuscule). Les intervalles ou les listes de noms ne sont pas acceptés.

Le sixième champ (le reste de la ligne) indique la commande à exécuter. Tout le reste de la ligne, jusqu'au retour chariot ou au caractère %, sera exécuté par /bin/sh, ou par le shell mentionné dans la variable SHELL du fichier cron. Les signes pour cent « % » dans les commandes seront transformés en retour chariot, sauf s'ils sont précédés d'une barre oblique inversée « \ ». Toutes les données se trouvant à la suite du premier % seront transmises à la commande sur son entrée standard. Il n'est pas possible d'écrire une commande sur plusieurs lignes, comme on le ferait dans un interpréteur avec la \ final.

Remarque : le jour d'exécution d'une commande peut être indiqué par deux champs (jour du mois, et jour de la semaine). Si les deux champs sont remplis (c'est-à-dire différents de « * »), la commande sera lancée quand l'un des champs au moins correspond à la date en cours. Par exemple
« 30 4 1,15 * 5 » exécutera une commande à 4 h 30 du matin les 1er et 15 de chaque mois, ainsi que chaque vendredi. Il est toutefois possible d'obtenir le résultat voulu en ajoutant un test à la commande (voir le dernier exemple dans la section EXEMPLE DE FICHIER CRONTAB plus bas).

À la place des cinq premiers champs peut apparaître l'une des huit chaînes spéciales :

    chaîne    signification
    ------    -------
    @reboot    Exécuter une fois au démarrage.
    @yearly    Exécuter une fois par an, « 0 0 1 1 * ».
    @annually    (identique à @yearly)
    @monthly    Exécuter une fois par mois, « 0 0 1 * * ».
    @weekly    Exécuter une fois par semaine, « 0 0 * * 0 ».
    @daily    Exécuter une fois par jour, « 0 0 * * * ».
    @midnight    (identique à @daily)
    @hourly    Exécuter une fois par heure, « 0 * * * * ».

Veillez noter que le démarrage, du point de vue de @reboot, est le moment où le démon cron(8) démarre. En particulier, cela peut arriver avant le démarrage de certains démons ou autres systèmes. Cela dépend de l'ordre de démarrage de la machine.

EXEMPLE DE FICHIER CRONTAB

L'exemple suivant présente le fichier crontab d'un utilisateur

# Utiliser /bin/bash pour lancer les commandes, plutôt que le shell par
# défaut /bin/sh
SHELL=/bin/bash
# Envoyer les résultats à Paul, sans tenir compte du propriétaire
MAILTO=paul
#
# Exécuter chaque jour, 5 minutes après minuit
5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# Exécuter le premier de chaque mois à 14 h 15 - Résultat envoyé à Paul
15 14 1 * *     $HOME/bin/monthly
# Énerver Joe du lundi au vendredi à 22 h
0 22 * * 1-5	mail -s "Il est 22 h" joe%Joe,%%Où sont tes enfants ?%
23 0-23/2 * * * echo "Tous les jours, 23 mn après 0 h, 2 h, 4 h…"
5 4 * * sun     echo "Tous les dimanches à 4 h 05"
# Tous les deuxièmes samedis du mois
0 4 8-14 * *    test $(date +\%u) -eq 6 && echo "deuxième samedi"

EXEMPLE DE FICHIER SYSTÈME CRON

L'exemple suivant présente le fichier crontab d'un système. Contrairement à la crontab d'un utilisateur, ce fichier contient le champ identifiant, comme dans le fichier /etc/crontab.

# /etc/crontab: crontab du système
# À la différence des autres crontabs, vous n'avez pas besoin
# d'exécuter la commande crontab pour installer la nouvelle version
# quand vous modifiez ce fichier. Ce fichier possède aussi un champ
# identifiant que les autres crontabs n'ont pas.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow ident.  commande
42 6 * * *        root    run-parts --report /etc/cron.daily
47 6 * * 7        root    run-parts --report /etc/cron.weekly
52 6 1 * *        root    run-parts --report /etc/cron.monthly
#

VOIR AUSSI
cron(8), crontab(1)

EXTENSIONS
Dans la désignation du jour de la semaine, le 0 et le 7 correspondent tous deux au dimanche. BSD et AT&T ne sont pas entièrement d'accord là-dessus.

Les intervalles et les listes sont autorisées dans le même champ. « 1-3,7-9 » sera rejeté par le cron AT&T ou BSD, ils n'acceptent que « 1-3 » ou « 7,8,9 ».

Les intervalles peuvent inclure des « pas », ainsi « 1-9/2 » équivaut à « 1,3,5,7,9 ».

Le nom des mois ou des jours de la semaine peut être utilisé.

Les variables d'environnement peuvent être définies dans la crontab. Avec BSD ou AT&T, l'environnement transmis aux processus fils est globalement celui de /etc/rc.

La sortie des commandes est soit envoyée au propriétaire de la crontab (pas sous BSD), soit dirigée vers une autre personne (pas sous SysV), soit la redirection est désactivée et aucun courrier ne sera envoyé (pas sous SysV non plus).

Toutes les commandes « @ » qui peuvent apparaître dans l'un des cinq premiers champs sont des extensions.

LIMITATIONS
Le démon cron s'exécute dans un certain fuseau horaire. Il ne prend pas en charge la définition d'un fuseau horaire par utilisateur. Toutes les tâches, tâches système ou tâches d'utilisateurs, s'exécuteront en fonction du fuseau horaire configuré. Même si un utilisateur définit la variable d'environnement TZ dans sa crontab, ceci n'affectera que les commandes exécutées dans la tâche, pas l'exécution des tâches crontab elles-mêmes.

La syntaxe de crontab ne permet pas de définir tous les moments possibles que l'on pourrait imaginer. Par exemple, il n'est pas simple de définir le dernier jour de semaine du mois. Si une tâche doit être exécutée à un moment particulier qui ne peut pas être défini avec la syntaxe de crontab, le meilleur moyen serait de faire vérifier la date et l'heure directement par le programme, et continuer l'exécution si elles correspondent au moment voulu.

Si le programme ne peut pas vérifier lui-même, alors un script enveloppe serait nécessaire. ncal et calendar sont des outils qui pourraient être pratiques pour analyser la date. Par exemple, le code enveloppe suivant permet d'exécuter un programme le dernier samedi du mois. Attention, la commande est présentée sur plusieurs lignes par commodité d'affichage, le fichier crontab n'accepte que les commandes sur une seule ligne.

0 4 * * Sat  [ "$(date +\%e)" =
 "`ncal | grep $(date +\%a | sed  -e 's/.$//') | sed -e 's/^.*-9]+*$/1/'`"
 ] && echo "Dernier samedi" && programme_à_exécuter

DIAGNOSTICS
Chaque entrée d'une crontab doit être terminée par un retour à la ligne. Si la dernière entrée ne se termine pas par un retour à la ligne, cron la considérera (au moins partiellement) cassée. Un avertissement sera écrit dans le journal système (« syslog »).

AUTEUR
Paul Vixie <paul@vix.com> est l'auteur de cron et de cette page de manuel. Cette page a ensuite été modifiée pour Debian par Steve Greenland, Javier Fernandez-Sanguino et Christian Kastner.

TRADUCTION
Cette page de manuel a été traduite et mise à jour par Christophe Blaess entre 1997 et 2003. La version présente dans Debian est dorénavant maintenue par Steve Petruzzello <dlist AT bluewin DOT ch> et les membres de la liste <debian-l10n-french AT lists DOT debian DOT org>. Veuillez signaler toute erreur de traduction par un rapport de bogue sur le paquet manpages-fr-extra.