Syntaxe CRONTAB

Syntaxe de la table du CRONTAB

Chaque entrée de la table (chaque ligne) correspond à une tâche à exécuter avec la syntaxe :

mm hh jj MMM JJJ tâche
  • mm représente les minutes (de 0 à 59)

  • hh représente l’heure (de 0 à 23)

  • jj représente le numéro du jour du mois (de 1 à 31)

  • MMM représente l’abréviation du nom du mois (jan, feb, …) ou bien le numéro du mois (de 1 à 12)

  • JJJ représente l’abréviation du nom du jour ou bien le numéro du jour dans la semaine :

    • 0 = dimanche

    • 1 = lundi

    • 2 = mardi

    • 6 = samedi

    • 7 = dimanche (représenté deux fois pour les deux types de semaine)

Pour chaque valeur numérique (mm, hh, jj, MMM, JJJ) les notations possibles sont :

  • * : à chaque unité (0, 1, 2, 3, 4…)

  • 5,8 : les unités 5 et 8

  • 2-5 : les unités de 2 à 5 (2, 3, 4, 5)

  • */3 : toutes les 3 unités (0, 3, 6, 9…)

  • 10-20/3 : toutes les 3 unités, entre la dixième et la vingtième (10, 13, 16, 19)

Si, sur la même ligne, le « numéro du jour du mois » et le « jour de la semaine » sont renseignés, alors cron exécutera la tâche quand l’un des champs correspond.
Par exemple, la ligne suivante indique que la tâche doit être exécutée les vendredis ainsi que le 13 de chaque mois, à minuit : 0 0 13 * 5 tâche

Journal des opérations

La tâche est une commande à exécuter. Si cette tâche écrit sur sa sortie standard ou son erreur standard, alors le daemon crond les envoie par courriel à l’utilisateur correspondant (celui indiqué par le sixième paramètre).

Afin d’éviter que ces informations soient transmises par courriel, il est possible de les rediriger dans des fichiers. Par exemple :

mm hh jj MMM JJJ tâche  > fichier-1  2> fichier-2  
  • fichier-1 contiendra la sortie standard

  • fichier-2 contiendra l’erreur standard

Ou pour accumuler les sortie et erreur standards dans un même fichier nommé journal.txt :

mm hh jj MMM JJJ tâche >> /mon/répertoire/journal.txt 2>&1
Raccourcis

Raccourcis

Description

Équivalent

@reboot

Au démarrage

Aucun

@yearly

Tous les ans

0 0 1 1 *

@annually

Tous les ans

0 0 1 1 *

@monthly

Tous les mois

0 0 1 * *

@weekly

Toutes les semaines

0 0 * * 0

@daily

Tous les jours

0 0 * * *

@midnight

Toutes les nuits

0 0 * * *

@hourly

Toutes les heures

0 * * * *

Exemples

Chacun des exemples enregistre l’espace disque libre (commande df) dans le fichier /tmp/df.log à des horaires différents. Afin de conserver l’historique, ces exemples utilisent la redirection >> qui permet d’ajouter les nouvelles données à la fin du fichier (si celui-ci existe déjà, dans le cas contraire il sera créé).

Tous les jours à 23 h 30 : 30 23 * * * df >> /tmp/df.log

Toutes les heures, passées de 5 minutes : 5 * * * * df >> /tmp/df.log

Tous les premiers du mois à 23 h 30 : 30 23 1 * * df >> /tmp/df.log

Tous les lundis à 22 h 28 : 28 22 * * 1 df >> /tmp/df.log

Tous les vendredis et tous les 13 à 11 h 22 : 22 11 13 * 5 df >> /tmp/df.log

Tous les vendredis 13 à 11 h 22 : 22 11 13 * * [ `date ‘+\%w’` -eq 5 ] && df >> /tmp/df.log

Du 2 au 5 de chaque mois à 10 h 12 : 12 10 2-5 * * df >> /tmp/df.log

Tous les jours pairs du mois à 23 h 59 : 59 23 */2 * * df >> /tmp/df.log

Tous les jours ouvrés à 22 heures : 0 22 * * 1-5 df >> /tmp/df.log

Toutes les 5 minutes : */5 * * * * df >> /tmp/df.log

Tous les derniers jours du mois (la barre oblique inversée devant % est obligatoire en édition de crontab, contrairement à l’exécution manuelle de la commande) :

0 0 28-31 * * [ `/bin/date +\%d` -gt `/bin/date +\%d -d “1 day”` ] && df >> /tmp/df.log

  • Tous les derniers dimanches du mois :

    • Première solution : comparer tous les dimanches avec celui de la semaine d’après.

 0 0 * * 0 [ `/bin/date +\%d` -gt `/bin/date +\%d -d "7 day"` ] && df >> /tmp/df.log
    • Deuxième solution : tester la dernière semaine tous les mois.

 0 0 25-31 1,3,5,7,8,10,12 0 my-script.sh
 0 0 24-30 4,6,9,11 0 my-script.sh
 0 0 22-29 2 0 my-script.sh
    • Troisième solution : lancer un script avec le calendrier.

 0 0 21-31 * * /bin/script.sh 
    • Quatrième solution, utiliser fcron.

  • Tous les premiers dimanches du mois :

    • Première solution : tester tous les dimanches5 :

0 0 * * 0 [ `date '+\%e'` -le 7 ] && df >> /tmp/df.log
    • Autre solution : le script avec calendrier :

 0 0 1-7 * * /bin/script2.sh
Horodatage du fichier de sortie

Les exemples ci-dessus utilisent la redirection >> afin de créer un journal sur plusieurs exécutions.

Afin, d’écrire dans des fichiers différents, il est possible d’utiliser la commande date, comme avec l’exemple suivant :

30 23 * * * df > /tmp/df_`date +\%d_\%m_\%Y_\%H_\%M`.log

(le caractère ` (accent grave, U+0060) est produit par la combinaison des touches [Alt
Gr
]+[7] sur le clavier AZERTY en France)

Bien entendu, une autre solution est de réaliser l’écriture du fichier dans un script appelle-df.sh :

 #!/bin/sh
 JJ_MM_ANNEE_HH_MM=`date +\%d_\%m_\%Y_\%H_\%M`
 df > /tmp/df_${JJ_MM_ANNEE_HH_MM}.log

Et de remplacer la table cron précédente par : 30 23 * * * appelle-df.sh

Commandes utiles

Ces commandes ne fonctionnent pas pour toutes les distributions Linux et Unix.

Indique l’horaire de la dernière tâche exécutée pour l’ensemble des utilisateurs :

ls -lut /etc/init.d/cron

Extraie du journal du système les informations concernant la table cron :

grep -w cron /var/log/syslog

Relance le démon cron : /etc/init.d/cron force-reload