CRONTAB(5)

NOM
crontab — Fichiers utilisés pour planifier l'exécution de programmes

DESCRIPTION
Un fichier crontab contient des instructions pour le démon cron(8) sous la forme simplifiée suivante : « lancer cette commande à telle heure, tel jour ». Chaque utilisateur peut définir 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 leur propre crontab, ce qui évite d'avoir à invoquer explicitement su(1) dans une commande cron(8).

Les lignes vides, les espaces en début de ligne et les tabulations sont ignorées. Les lignes dont le premier caractère autre qu'une espace est un croisillon « # » 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(8), car ils seraient considérés comme faisant partie 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 est soit une affectation de variable d'environnement, soit une commande cron(8). Une ligne d'affectation de variable 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 font partie intégrante de la valeur affectée à la variable nom. La chaîne de valeur peut être inscrite entre guillemets (simples ou doubles mais correspondants) afin de conserver les espaces initiales et finales.

Plusieurs variables d'environnement sont automatiquement définies par le démon cron(8). SHELL prend la valeur « /bin/sh », et LOGNAME et HOME sont définies à partir de la ligne de /etc/passwd correspondant au propriétaire de la crontab. HOME et SHELL peuvent être réaffectées explicitement dans la crontab, LOGNAME ne peut l'être.

Remarque : la variable LOGNAME est parfois nommée USER sur les systèmes BSD et est aussi définie automatiquement.

En plus de LOGNAME, HOME et SHELL, cron(8) consultera 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'adresse indiquée. Si MAILTO est définie mais vide (MAILTO=""), aucun courrier ne sera envoyé. Sinon, le courrier sera envoyé au propriétaire de la crontab. Cette option est utile si vous décidez d'utiliser /bin/mail comme expéditeur de messages à la place de /usr/lib/sendmail. Notez cependant que /bin/mail ne prend pas en charge les alias et qu'UUCP ne lit en général pas ses messages. Si MAILFROM est définie (et non vide), son contenu sera utilisé comme adresse d'expéditeur, sinon c'est le nom d’utilisateur réalisant l’exécution qui sera utilisé. Cette variable et aussi héritée de l’environnement du processus crond.

Nota : les variables MAILFROM et MAILTO sont remplacées par leur valeur, et les définir comme dans l'exemple suivant fonctionnera comme prévu : MAILFROM=cron-$USER@cron ($USER est remplacé par l'utilisateur du système).

Par défaut, cron(8) envoie un courrier en utilisant l'en-tête « Content-type: text/plain » avec comme valeur du paramètre « charset= » l'encodage (« charmap/codeset ») des paramètres régionaux avec lesquels crond(8) a été lancé, c'est-à-dire soit les paramètres régionaux par défaut du système si aucune variable d'environnement LC_* n'est définie, soit les paramètres régionaux indiqués par ces variables LC_* (voir locale(7)). Vous pouvez utiliser un autre encodage de caractères pour envoyer les sorties de tâches de cron(8) par message en positionnant les variables CONTENT_TYPE et CONTENT_TRANSFER_ENCODING dans une crontab aux valeurs souhaitées des en-têtes de message de mêmes noms.

La variable CRON_TZ spécifie le fuseau horaire spécifique à la table de cron(8). L'utilisateur doit saisir dans cette table une heure tenant compte du fuseau horaire spécifié. L'heure utilisée pour écrire dans un fichier journal tient compte quant à elle du fuseau horaire des paramètres locaux de la machine où le démon s'exécute.

La variable d'environnement MLS_LEVEL fournit la prise en charge de contextes de sécurité SELinux multiples par tâche dans la même crontab. Par défaut, les tâches de cron(8) s'exécutent avec le contexte de sécurité SELinux par défaut de l'utilisateur qui a créé le fichier crontab. Lorsqu'on utilise des rôles et des niveaux de sécurité multiples, cela peut ne pas suffire, car un même utilisateur peut agir sous différents rôles ou à des niveaux de sécurité différents. Pour plus d'informations à propos des rôles et de SELinux MLS/MCS, voir selinux(8) et l'exemple de crontab mentionné plus loin dans ce document. Vous pouvez définir la variable MLS_LEVEL avec la chaîne du contexte de sécurité SELinux qui spécifie le contexte de sécurité SELinux particulier dans lequel vous souhaitez que les tâches soient exécutées. crond va alors définir le contexte d'exécution des tâches qui vérifient les spécifications du contexte de sécurité particulier. Pour plus d'informations, voir l'option -s de crontab(1).

La variable RANDOM_DELAY permet de retarder le démarrage des tâches d'un nombre aléatoire de minutes dont la limite supérieure est spécifiée par la variable. Le facteur d'échelle aléatoire est déterminé au cours du démarrage du démon de cron(8) ; il reste donc constant pendant toute la durée d'exécution du démon.

Le format d'une commande cron(8) est similaire à la norme V7, avec quelques options permettant de garder une compatibilité ascendante. Chaque ligne contient cinq champs de date et d'heure, suivis d'un champ nom_utilisateur (s'il s'agit du fichier crontab du système), lui-même suivi d'une commande. Les commandes sont exécutées par cron(8) quand les champs « minute », « heure » et « mois de l'année » correspondent à la date actuelle, et au moins un des deux champs « jour » (« jour du mois » ou « jour de la semaine ») correspond à la date actuelle (voir la note qui suit).

Notez que cela signifie que les heures qui n'existent pas, comme les « heures manquantes » pendant les changements d'heure saisonniers, ne correspondront jamais, si bien que les tâches planifiées durant ces « heures manquantes » ne seront pas exécutées. De même, les heures qui surviennent plus d'une fois (là encore pendant les changements d'heure saisonniers) feront que les tâches correspondantes seront exécutées deux fois.

cron(8) examine les entrées cron(8) chaque minute.

Les champs heure et 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 ou 7 pour dimanche, ou utiliser des 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 8-11 dans le champ « heure » correspond à une exécution aux heures 8, 9, 10 et 11. Le premier nombre doit être inférieur ou égal au second

Il est possible de répartir aléatoirement le moment de l'exécution dans un intervalle. Un nombre aléatoire est généré dans un intervalle spécifié à l'aide de deux nombres séparés par un tilde. L'intervalle spécifié est inclusif. Par exemple, 6~15 dans le champ des minutes génère un nombre de minutes aléatoire entre 6 et 15. Le nombre aléatoire est généré lors de la lecture du fichier crontab. Le premier nombre doit être inférieur ou égal au second. Vous pouvez omettre un ou les deux nombres qui spécifient l'intervalle. Par exemple, ~ dans le champ des minutes génère un nombre aléatoire de minutes entre 0 et 59.

Les listes sont permises. Une liste est un ensemble de nombres ou d'intervalles séparés par des virgules. Exemples : « 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 heure demande une exécution toutes les heures paires. Une alternative avec la norme 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 ». Veuillez noter que les pas ne sont évalués que dans le champ auquel ils s'appliquent. Par exemple, « */23 » dans un champ des heures demande d'exécuter la tâche aux heures 0 et 23 d'un jour calendaire. Consulter la rubrique « NOTES » ci-dessous pour un contournement.

On peut aussi utiliser des noms (en anglais) dans les champs des mois ou des jours de la semaine. Utilisez les trois premières lettres du jour ou du mois considéré (pas de différence capitale/minuscule). Les intervalles ou les listes de noms, comme « mon,wed,fri », « jan-mar », sont acceptés.

Si l'UID du propriétaire est 0 (root), le premier caractère d'un champ de la crontab peut être le caractère « - », ce qui empêchera cron(8) d'écrire un message syslog à propos de la commande en cours d'exécution.

Le sixième champ (le reste de la ligne) indique la commande à exécuter. Tout le contenu de cette portion « commande », jusqu'au caractère nouvelle ligne ou au caractère « % », sera exécuté par /bin/sh ou par l'interpréteur de commande spécifié dans la variable SHELL du fichier cron(8). Un caractère pourcentage « % » dans la commande est transformé en caractère nouvelle ligne, sauf s'il est précédé d'une barre oblique inversée « \ », et toutes les données se trouvant à la suite du premier « % » seront transmises à la commande sur son entrée standard.

Remarque : le jour d'exécution d'une commande peut être indiqué dans les deux champs « jour du mois » et « jour de la semaine ». Si les deux champs sont restrictifs (c'est-à-dire différents de « * »), la commande sera lancée quand au moins un des champs correspondra à la date actuelle. 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.

La syntaxe d'un fichier crontab peut être vérifiée avant son installation en utilisant l'option -T. Consulter crontab(1) pour plus de détails.

EXEMPLE DE FICHIER CRON
# Utiliser /bin/sh pour lancer les commandes sans tenir compte de /etc/passwd
SHELL=/bin/sh
# Envoyer les résultats à Paul, sans tenir compte du propriétaire de la crontab
MAILTO=paul
#
CRON_TZ=Japan
# 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
# Asticoter 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 "exécution tous les jours, 23 mn après 0 h, 2 h, 4 h…"
5 4 * * sun     echo "exécution tous les dimanches à 4 h 05"

Tâches dans /etc/cron.d/
Les tâches dans cron.d et /etc/crontab sont des tâches système qui sont en général accessibles à plusieurs utilisateurs, et il est donc nécessaire de leur ajouter le nom d'utilisateur. MAILTO sur la première ligne est facultatif.

EXEMPLE DE TÂCHE DANS /etc/cron.d/job
#se connecter en tant que root
#créer une tâche avec votre éditeur préféré (par exemple vim)
MAILTO=root
* * * * * root touch /tmp/file

NOTES
Comme indiqué ci-dessus, les valeurs ignorées ne fonctionnent que pendant la période à laquelle elles sont attachées. Par exemple, spécifier « 0/35 » comme champ des minutes pour une entrée de la crontab ne déclenchera pas l'exécution de la tâche correspondante toutes les 35 minutes ; au lieu de cela, elle sera exécutée deux fois par heure aux minutes 0 et 35. Pour un contrôle plus fin, vous pouvez écrire quelque chose comme suit :
* * * * * if [ $(expr (date +%s) / 60 \) % 58) = 0 ]; then echo exécution toutes les 58 minutes; fi
0 * * * * if [ $(expr \( $(date +%s) / 3600 \) % 23) = 0 ]; then echo exécution toutes les 23 h à l'heure ronde; fi
Ajuster selon les besoins si votre commande date(1) n'accepte pas « +%s » comme spécificateur de chaîne de formatage pour afficher l'horodatage UNIX actuel.

SELinux avec sécurité multi-niveau (MLS).
Dans une crontab, il est important de spécifier un niveau de sécurité à l'aide de crontab -s ou en spécifiant le niveau requis sur la première ligne de la crontab. Chaque niveau est indiqué dans /etc/selinux/targeted/seusers. Lorsqu'on utilise crontab(1) en mode MLS, il est particulièrement important de :
- vérifier/modifier le rôle effectif,
- définir le rôle correct pour directory qui est utilisé pour les entrées/sorties.

EXEMPLE POUR SELINUX MLS
# se connecter en tant que root
newrole -r sysadm_r
mkdir /tmp/SystemHigh
chcon -l SystemHigh /tmp/SystemHigh
crontab -e
# écrire dans le fichier crontab
MLS_LEVEL=SystemHigh
0-59 * * * * id -Z > /tmp/SystemHigh/crontest

FICHIERS
Le fichier système principal de crontab /etc/crontab. Un répertoire /var/spool/cron/ pour stocker les crontab définies par les utilisateurs. Un répertoire /etc/cron.d/ pour stocker les crontab du système.

VOIR AUSSI
cron(8), crontab(1)

EXTENSIONS
Ces « alias » spéciaux de spécification temporelle qui remplacent les cinq champs d'heure et de date initiaux et qui sont préfixés avec le caractère « @ » sont pris en charge :

@reboot    :    Exécuter une fois après le démarrage.
@yearly    :    Exécuter une fois par an,      idem  "0 0 1 1 *".
@annually  :    Exécuter une fois par an,      idem  "0 0 1 1 *".
@monthly   :    Exécuter une fois par mois,    idem  "0 0 1 * *".
@weekly    :    Exécuter une fois par semaine, idem  "0 0 * * 0".
@daily     :    Exécuter une fois par jour,    idem  "0 0 * * *".
@hourly    :    Exécuter une fois par heure,   idem  "0 * * * *".

AVERTISSEMENTS
Les fichiers de crontab doivent être des fichiers ordinaires ou des liens symboliques vers des fichiers ordinaires et ils ne doivent être ni exécutables, ni accessibles en écriture par tout autre utilisateur que leur propriétaire. Il est possible de passer outre cette exigence en utilisant l'option -p sur la ligne de commande de crond. Si inotify est pris en charge, les modifications dans les crontabs liées symboliquement ne sont pas systématiquement rapportées par le démon de cron(8). Pour recharger les crontabs, le démon de cron(8) doit recevoir un signal SIGHUP. Il s'agit d'une limitation de l'API inotify.

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

AUTEUR
Paul Vixie (vixie@isc.org)

TRADUCTION
La traduction française de cette page de manuel a été créée par Steve Petruzzello <dlist@bluewin.ch>, Nicolas François <nicolas.francois@centraliens.net>, David Prévot <david@tilapin.org> et Lucien Gentis <lucien.gentis@waika9.com>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 (https://www.gnu.org/licenses/gpl-3.0.html) concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org.