crontab

crontab

crontab est le nom du programme sous Unix (ou Linux) qui permet d'éditer des tables de configuration du programme cron. Par extension, on appelle souvent cron (ou cron job en anglais) toute application lancée à horaire fixe.

La commande crontab édite en fait un fichier relatif à l'utilisateur qui l'exécute, et en vérifie la syntaxe. Ce fichier se situe dans l'arborescence /var, par exemple :

/var/spool/cron/crontabs/utilisateur (AIX, HP-UX, Solaris, Debian GNU/Linux et Ubuntu)
/var/spool/cron/tabs/utilisateur (SuSE GNU/Linux)
/var/cron/tabs/utilisateur (FreeBSD et OpenBSD)

Ainsi pour l'utilisateur root sur une machine Debian, la table cron sera stockée dans :

/var/spool/cron/crontabs/root

La majorité des systèmes Linux (SuSE, Debian, Red Hat) disposent en plus d'une crontab centralisée dans /etc/crontab. On trouve également des dossiers /etc/cron.d, /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly et /etc/cron.monthly qui contiennent les tables cron des différents parties du système (rotation des logs, mise à jour de fichiers...).

Pour les postes de travail qui ne fonctionnent pas forcément 24h/24, une application appelée anacron permet de lancer les commandes qui auraient du l'être lorsque l'ordinateur était éteint.

Sommaire

Syntaxe

Visualisation

Afin d'afficher le contenu de la table cron (pour l'utilisateur courant), il suffit d'exécuter la commande suivante :

$ crontab -l

Cette commande ne permet pas d'afficher la crontab centralisée (/etc/crontab).

Modification

Afin d'éditer la table cron (pour l'utilisateur courant), il suffit d'exécuter la commande suivante :

$ crontab -e

Cette commande a pour effet de lancer l'éditeur par défaut[1] (en général vi) présentant la table actuelle (donc aucune s'il s'agit du premier lancement de crontab). Cette commande ne permet pas de modifier la crontab centralisée (/etc/crontab). Ne pas oublier d'exporter l'éditeur : pour vi lancer la commande suivante :

$ export EDITOR=vi


Chaque entrée de la table (chaque ligne) correspond à une tâche à exécuter et est notée de la façon suivante :

mm hh jj MMM JJJ tâche > log

Dans cette syntaxe :

  • 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 le numéro du mois (de 1 à 12) ou l'abréviation du nom du mois (jan, feb, mar, apr, ...)
  • JJJ représente l'abréviation du nom du jour ou le chiffre correspondant au jour de la semaine (0 représente le dimanche, 1 représente le lundi, ..., 7 représente le dimanche)
  • tâche représente la commande ou le script shell à exécuter
  • log représente le nom d'un fichier dans lequel stocker le journal des opérations. Si la clause > log n'est pas spécifiée, cron enverra automatiquement un courriel de confirmation. Pour éviter cela, il suffit de spécifier > /dev/null.

Pour chaque unité de temps (minute/heure/...) les notations possibles sont :

  • * : à chaque unité de temps (0, 1, 2, 3, 4...)
  • 5,8 : les unités de temps 5 et 8
  • 2-5 : les unités de temps de 2 à 5 (2, 3, 4, 5)
  • */3 : toutes les 3 unités de temps (0, 3, 6, 9...)
  • 10-20/3 : toutes les 3 unités de temps, entre la dixième et la vingtième (10, 13, 16, 19)

Si, sur la même ligne, on trouve précisées une unité de temps « numéro du jour du mois » et une unité de temps « jour de la semaine », celles-ci sont considérées par crontab comme cumulatives.

Un crontab peut aussi être modifié en insérant les informations dans un fichier texte (crontab.txt) puis en exécutant la commande

$ crontab crontab.txt

Exemples

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 Tous les jours 0 0 * * *
@hourly Toutes les heures 0 * * * *

Imaginons que l'on veuille faire un journal (dans le fichier /tmp/log_df.txt par exemple) automatisé de l'espace disque libre (commande df) à des intervalles de temps précis :

  • Tous les jours à 23h30 :
 30 23 * * * df >>/tmp/log_df.txt
  • Toutes les heures, passées de 5 minutes :
 5 * * * * df >>/tmp/log_df.txt
  • Tous les premiers du mois à 23h30 :
 30 23 1 * * df >>/tmp/log_df.txt
  • Tous les lundis à 22h28 :
 28 22 * * 1 df >>/tmp/log_df.txt
  • Tous les vendredis 13 de n'importe quel mois à 11h22 :
 22 11 13 * 5 df >>/tmp/log_df.txt
  • Du 2 au 5 de chaque mois à 10h12 :
 12 10 2-5 * * df >>/tmp/log_df.txt
  • Tous les jours pairs du mois à 23h59 :
 59 23 */2 * * df >>/tmp/log_df.txt
  • Tous les jours à 22h que les jours ouvrés :
 0 22 * * 1-5 df >>/tmp/log_df.txt
  • Toutes les 5 minutes :
 */5 * * * * df >>/tmp/log_df.txt
  • Tous les derniers jours du mois (l'antislash devant % est obligatoire en édition de crontab, contrairement à l'exécution de la commande manuellement) :
 0 0 28-31 * * [ `/bin/date +\%d` -gt `/bin/date +\%d -d "1 day"` ] && df >>/tmp/log_df.txt
  • 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/log_df.txt
    • 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 dimanches.
0 0 * * 0 [ `date '+\%e'` -le 7 ] && df >>/tmp/log_df.txt
    • Autre solution : le script avec calendrier.
 0 0 1-7 * * /bin/script2.sh


Autre exemple, le script shell suivant (que l'on supposera stocké dans /home/backup sous le nom backup.cmd) exporte les enregistrements de MySQL (de la table ccmusers par exemple) dans un fichier dont le nom est ccmusers suivi de la date sous la forme jour-mois-annee-heure-minute:

 #!/bin/sh
 DATE=$(date +%d-%m-%Y-%H-%M)
 /usr/local/mysql/bin/mysqldump -u root ccmusers > /home/backup/ccmusers${DATE}.sql

Ainsi pour automatiser (chaque jour à 23h59) le backup de la table ccmusers de MySQL et l'appel d'une page web (chaque jour à 21h30), il suffira d'ajouter l'entrée suivante dans la table cron:

 59 23 * * * /home/backup/backup.cmd >>/dev/null
 30 21 * * * wget -O /dev/null http://example.com/mapage.html >>/dev/null

Commandes utiles

ls -lut /etc/init.d/cron

permet d'avoir quelques informations dont le propriétaire et le dernier lancement du démon cron

grep /usr/sbin/cron /var/log/syslog

permet de voir quelques logs inhérents au démon cron

/etc/init.d/cron force-reload

permet de relancer le démon pour prendre en compte des modifications de droits ou autres

Changements d'heure

Si vous utilisez le changement d'heure hiver/été, selon les règles en vigueur en France, les tâches Cron entre 02h00 et 02h59 du dernier dimanche du mois de mars ne seront pas exécutées (on passe de 2h à 3h). À l'inverse, les tâches Cron entre 02h00 et 02h59 du dernier dimanche du mois d'octobre seront exécutées deux fois (on passe de 3h à 2h). Cependant, la plupart des systèmes Unix sont configurés pour utiliser au niveau système le UTC, qui n'est pas sujet à ces règles de changement d'heure et évite donc ce désagrément.

« Il existe des dispositions spéciales lorsque l'horloge est modifiée de moins de 4 heures, par exemple au début et à la fin de l'heure d'été. Si l'heure a été avancée, les travaux qui auraient dû être exécutés à ce moment là le seront juste après le changement. À l'inverse, si l'heure a été retardée de moins de 3 heures, les travaux qui tombent dans cet intervalle de temps ne seront pas exécutés de nouveau.

Seuls les travaux qui sont exécutés à un moment particulier (ni spécifiés par @hourly ni par « * » dans le champ heure ou minute) sont affectés. Les travaux spécifiés avec des astérisques sont exécutés immédiatement sur la base de l'heure modifiée.

Les changements d'horloge de plus de 3 heures sont considérés comme des corrections de l'horloge, et la nouvelle heure est utilisée immédiatement. »

— Extrait du man cron sur Debian

Voir aussi

Articles connexes

Liens externes

Sources

Certains passages de cet article, ou d'une version antérieure de cet article, sont basés sur l'article Ordonnancer des tâches du site Web Comment ça marche ?. L'article d'origine porte la notice de copyright suivante : « © Copyright 2004 Jean-François Pillou - Hébergé par Web-solutions.fr. Ce document issu de CommentCaMarche.net est soumis à la licence GNU FDL. Vous pouvez copier, modifier des copies de cette page tant que cette note apparaît clairement. »

(en) Unix pour les nuls

Notes

  1. Défini par la variable d'environnement $VISUAL ou $EDITOR

Wikimedia Foundation. 2010.

Contenu soumis à la licence CC-BY-SA. Source : Article crontab de Wikipédia en français (auteurs)

Игры ⚽ Нужно сделать НИР?

Regardez d'autres dictionnaires:

  • Crontab — est le nom du programme sous Unix (ou Linux) qui permet d éditer des tables de configuration du programme cron. Par extension, on appelle souvent cron (ou cron job en anglais) toute application lancée à horaire fixe. La commande crontab édite en… …   Wikipédia en Français

  • Crontab — Der cron Daemon ist eine Jobsteuerung von Unix bzw. Unix artigen Betriebssystemen wie Linux, BSD oder Mac OS X, die wiederkehrende Aufgaben (cronjobs) automatisch zu einer bestimmten Zeit ausführen kann. Häufig führt der Cron Daemon wichtige… …   Deutsch Wikipedia

  • crontab — noun A Unix command used to schedule the periodic execution of other commands. However, crontab is for recurring jobs, such as Run this command at midnight …   Wiktionary

  • Crontab (Unix) — crontab crontab est le nom du programme sous Unix (ou Linux) qui permet d éditer des tables de configuration du programme cron. Par extension, on appelle souvent cron (ou cron job en anglais) toute application lancée à horaire fixe. La commande… …   Wikipédia en Français

  • Crontab — …   Википедия

  • crontab — Tabelle mit Aufträgen zur Ausführung eines oder regelmässiger Kommandos zu einem festen Zeitpunkt …   Acronyms

  • crontab — ● ►en n. f. ►UNIX table contenant des commandes (par exemple une sauvegarde) qui doivent être exécutées périodiquement (c est le programme cron qui s en charge). Les périodes peuvent être des heures (cron.hourly), des jours (cron.daily), des… …   Dictionnaire d'informatique francophone

  • crontab — Tabelle mit Aufträgen zur Ausführung eines oder regelmässiger Kommandos zu einem festen Zeitpunkt …   Acronyms von A bis Z

  • cron — Содержание 1 Замена текстового редактора для crontab 2 crontab …   Википедия

  • Cron — is a time based scheduling service in Unix like computer operating systems. cron is short for chronograph . [ [http://drupal.org/node/937#cron Drupal Terminology Page] ] cron has been recreated several times in its history. Design cron is driven… …   Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”