cron - cron


cron
Développeur(s) Laboratoires AT&T Bell
Première version mai 1975 ; il y a 46 ans ( 1975-05 )
Écrit en C
Système opérateur Linux , macOS , FreeBSD
Taper Planificateur de travaux

L' utilitaire de ligne de commande cron , également connu sous le nom de tâche cron, est un planificateur de tâches sur les systèmes d'exploitation de type Unix . Les utilisateurs qui configurent et gèrent les environnements logiciels utilisent cron pour planifier des tâches (commandes ou scripts shell ) à exécuter périodiquement à des heures, des dates ou des intervalles fixes. Il automatise généralement la maintenance ou l'administration du système, bien que sa nature à usage général le rende utile pour des tâches telles que le téléchargement de fichiers à partir d' Internet et le téléchargement de courriers électroniques à intervalles réguliers.

Cron est le plus approprié pour planifier des tâches répétitives. La planification de tâches ponctuelles peut être accomplie à l'aide de l' utilitaire at associé .

Aperçu

Les actions de cron sont pilotées par un fichier crontab (table cron), un fichier de configuration qui spécifie les commandes shell à exécuter périodiquement selon un calendrier donné. Les fichiers crontab sont stockés là où les listes de tâches et autres instructions du démon cron sont conservées. Les utilisateurs peuvent avoir leurs propres fichiers crontab individuels et il existe souvent un fichier crontab à l'échelle du système (généralement dans /etcou un sous-répertoire de /etc) que seuls les administrateurs système peuvent modifier.

Chaque ligne d'un fichier crontab représente un travail et ressemble à ceci :

# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;
# │ │ │ │ │                                   7 is also Sunday on some systems)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * <command to execute>

La syntaxe de chaque ligne attend une expression cron composée de cinq champs qui représentent le temps d'exécution de la commande, suivi d'une commande shell à exécuter.

Alors que normalement le travail est exécuté lorsque les champs de spécification de l'heure/de la date correspondent tous à l'heure et à la date actuelles, il y a une exception : si à la fois le "jour du mois" (champ 3) et le "jour de la semaine" (champ 5) sont restreints ( pas "*"), alors l'un ou les deux doivent correspondre au jour actuel.

Par exemple, ce qui suit efface le journal des erreurs Apache à une minute après minuit (00h01) tous les jours, en supposant que le shell par défaut pour l'utilisateur cron est Bourne shell compatible:

1 0 * * * printf "" > /var/log/apache/error_log

Cet exemple exécute un programme shell appelé export_dump.sh à 23h45 (23h45) tous les samedis.

45 23 * * 6 /home/oracle/scripts/export_dump.sh

Remarque : Il est également possible de spécifier l' */nexécution pour chaque n intervalle de temps. En outre, la spécification de plusieurs intervalles de temps spécifiques peut être effectuée avec des virgules (par exemple, 1,2,3). Ce qui suit affichera "hello world" sur la ligne de commande toutes les 5 minutes de chaque première, deuxième et troisième heure (c'est-à-dire 01h00, 01h05, 01h10, jusqu'à 03h55).

*/5 1,2,3 * * * echo hello world

Le fichier de configuration d'un utilisateur peut être modifié en appelant crontab -equel que soit l'endroit où l'implémentation réelle stocke ce fichier.

Certaines cronimplémentations, telles que la populaire 4e édition BSD écrite par Paul Vixie et incluse dans de nombreuses distributions Linux, ajoutent un sixième champ : un nom d'utilisateur de compte qui exécute le travail spécifié (sous réserve de l'existence et des autorisations de l'utilisateur). Cela n'est autorisé que dans les crontabs du système, pas dans les autres, qui sont chacune affectées à un seul utilisateur à configurer. Le sixième champ est parfois utilisé pour l' année au lieu d'un nom d'utilisateur de compte - le démon nncron pour Windows le fait.

L'implémentation Amazon EventBridge de cron n'utilise pas le jour de la semaine basé sur 0, mais plutôt 1-7 SUN-SAT (au lieu de 0-6), ainsi que la prise en charge de fonctionnalités d'expression supplémentaires telles que le premier jour de la semaine et le dernier jour de -mois.

Définitions de planification prédéfinies non standard

Certaines implémentations de cron prennent en charge les macros non standard suivantes :

Entrée La description Équivalent à
@yearly (or @annually) Exécuté une fois par an à minuit le 1er janvier 0 0 1 1 *
@monthly Exécuter une fois par mois à minuit le premier jour du mois 0 0 1 * *
@weekly Course une fois par semaine à minuit le dimanche matin 0 0 * * 0
@daily (or @midnight) Courir une fois par jour à minuit 0 0 * * *
@hourly Exécuter une fois par heure au début de l'heure 0 * * * *
@reboot Exécuter au démarrage N / A

@rebootconfigure un travail pour qu'il s'exécute une fois au démarrage du démon. Étant donné que cron n'est généralement jamais redémarré, cela correspond généralement à la machine en cours de démarrage. Ce comportement est appliqué dans certaines variantes de cron, telles que celle fournie dans Debian , de sorte que le simple redémarrage du démon ne réexécute pas les @reboottâches.

@rebootpeut être utile s'il est nécessaire de démarrer un serveur ou un démon sous un utilisateur particulier et que l'utilisateur n'a pas accès à la configuration d' init pour démarrer le programme.

Autorisations cron

Ces deux fichiers jouent un rôle important :

  • /etc/cron.allow - Si ce fichier existe, il doit contenir le nom de l'utilisateur pour que cet utilisateur soit autorisé à utiliser les tâches cron.
  • /etc/cron.deny - Si le fichier cron.allow n'existe pas mais que le fichier /etc/cron.deny existe, pour utiliser les tâches cron, les utilisateurs ne doivent pas être répertoriés dans le fichier /etc/cron.deny.

Notez que si aucun de ces fichiers n'existe, selon les paramètres de configuration dépendant du site, soit seul le super utilisateur peut utiliser les tâches cron, soit tous les utilisateurs peuvent utiliser les tâches cron.

Gestion des fuseaux horaires

La plupart des implémentations cron interprètent simplement les entrées crontab dans le paramètre de fuseau horaire du système sous lequel le démon cron s'exécute. Cela peut être une source de litige si une grande machine multi-utilisateurs a des utilisateurs dans plusieurs fuseaux horaires, en particulier si le fuseau horaire par défaut du système inclut l' heure d'été potentiellement source de confusion . Ainsi, une implémentation de cron peut, dans un cas particulier, reconnaître des lignes de la forme "CRON_TZ=<fuseau horaire>" dans les crontabs utilisateur, en interprétant les entrées de crontab suivantes par rapport à ce fuseau horaire.

Histoire

Les premières versions

Le cron dans la version 7 Unix était un service système (appelé plus tard un démon ) invoqué à partir du /etc/rcmoment où le système d'exploitation est entré en mode multi-utilisateur. Son algorithme était simple :

  1. Lire /usr/lib/crontab
  2. Déterminez si des commandes doivent s'exécuter à la date et à l'heure actuelles, et si c'est le cas, exécutez-les en tant que superutilisateur , root.
  3. Dormir une minute
  4. Répétez à partir de l'étape 1.

Cette version de cron était basique et robuste, mais elle consommait également des ressources, qu'elle trouve ou non du travail à faire. Lors d'une expérience à l' Université Purdue à la fin des années 1970 pour étendre le service de cron aux 100 utilisateurs sur un VAX en temps partagé , il s'est avéré qu'il mettait trop de charge sur le système.

Capacité multi-utilisateurs

La prochaine version de cron, avec la sortie d' Unix System V , a été créée pour étendre les capacités de cron à tous les utilisateurs d'un système Unix, pas seulement au superutilisateur. Bien que cela puisse sembler trivial aujourd'hui avec la plupart des systèmes Unix et similaires ayant des processeurs puissants et un petit nombre d'utilisateurs, à l'époque, cela nécessitait une nouvelle approche sur un système à un MIPS ayant environ 100 comptes d'utilisateurs.

Dans le numéro d'août 1977 de Communications of the ACM , WR Franta et Kurt Maly ont publié un article intitulé « Une structure de données efficace pour l'ensemble d'événements de simulation », décrivant une structure de données de file d'attente d'événements pour des systèmes de simulation pilotés par événements discrets qui a démontré « performances supérieures à celles des algorithmes de liste chaînée simples couramment utilisés", bon comportement compte tenu des distributions temporelles non uniformes et complexité dans le pire des cas , "n" étant le nombre d'événements dans la file d'attente.

Un étudiant diplômé de Purdue, Robert Brown, examinant cet article, a reconnu le parallèle entre les simulateurs cron et les simulateurs d'événements discrets et a créé une implémentation du gestionnaire de liste d'événements Franta-Maly (ELM) à des fins d'expérimentation. Les simulateurs d'événements discrets fonctionnent en temps virtuel , éliminant les événements de la file d'attente des événements le plus rapidement possible et faisant avancer leur notion de « maintenant » à l'heure prévue du prochain événement. L'exécution du simulateur d'événements en « temps réel » au lieu du temps virtuel a créé une version de cron qui passait la plupart de son temps à dormir, attendant l'heure prévue pour exécuter la tâche en tête de la liste des événements.

L'année scolaire suivante, de nouveaux étudiants ont rejoint le programme d'études supérieures de Purdue, dont Keith Williamson, qui a rejoint le personnel des systèmes du département d'informatique. En tant que "tâche d'échauffement", Brown lui a demandé d'étoffer le prototype de cron dans un service de production, et ce cron multi-utilisateur a été utilisé à Purdue à la fin de 1979. Cette version de cron a complètement remplacé celui /etc/cronqui était utilisé sur l'ordinateur. VAX 11/780 du département des sciences exécutant 32/V.

L'algorithme utilisé par ce cron est le suivant :

  1. Au démarrage, recherchez un fichier nommé .crontabdans les répertoires personnels de tous les titulaires de compte.
  2. Pour chaque fichier crontab trouvé, déterminez la prochaine fois dans le futur que chaque commande doit être exécutée.
  3. Placez ces commandes sur la liste d'événements Franta-Maly avec leur heure correspondante et leur spécificateur de temps "cinq champs".
  4. Entrez dans la boucle principale :
    1. Examinez l'entrée de la tâche en tête de la file d'attente, calculez jusqu'où elle doit s'exécuter dans le futur.
    2. Dormez pendant cette période.
    3. Au réveil et après avoir vérifié l'heure exacte, exécutez la tâche en tête de file d'attente (en arrière-plan) avec les privilèges de l'utilisateur qui l'a créée.
    4. Déterminez la prochaine fois à l'avenir pour exécuter cette commande et placez-la de nouveau sur la liste d'événements à cette valeur de temps.

De plus, le démon répond aux signaux SIGHUP pour analyser à nouveau les fichiers crontab modifiés et programme des "événements de réveil" spéciaux sur l'heure et la demi-heure pour rechercher les fichiers crontab modifiés. De nombreux détails sont omis ici concernant les inexactitudes du suivi de l'heure de l'ordinateur, de la planification des alarmes Unix, des changements d'heure explicites et de la gestion des processus, qui représentent tous la majorité des lignes de code de ce cron. Ce cron a également capturé la sortie de stdout et stderr et a envoyé toute sortie par courrier électronique au propriétaire de la crontab.

Les ressources consommées par ce cron ne varient qu'en fonction de la quantité de travail qui lui est fournie et n'augmentent pas intrinsèquement avec le temps, à l'exception de la vérification périodique des changements.

Williamson a terminé ses études et a quitté l'université avec une maîtrise ès sciences en informatique et a rejoint AT&T Bell Labs à Murray Hill, New Jersey, et a emporté ce cron avec lui. Chez Bell Labs, lui et d'autres ont incorporé la commande Unixat dans cron, déplacé les fichiers crontab des répertoires personnels des utilisateurs (qui n'étaient pas spécifiques à l'hôte) et dans un répertoire de spool commun spécifique à l'hôte, et ont nécessairement ajouté la crontabcommande pour autoriser aux utilisateurs de copier leurs crontabs dans ce répertoire de spool.

Cette version de cron est apparue plus tard en grande partie inchangée dans Unix System V et dans BSD et leurs dérivés, Solaris de Sun Microsystems , IRIX de Silicon Graphics , HP-UX de Hewlett-Packard et AIX d' IBM . Techniquement, la licence d'origine pour ces implémentations devrait appartenir à la Purdue Research Foundation qui a financé le travail, mais cela a eu lieu à une époque où peu d'intérêt était accordé à ces questions.

Versions modernes

Avec l'avènement du projet GNU et de Linux , de nouveaux crons sont apparus. Le plus répandu d'entre eux est le cron Vixie, initialement codé par Paul Vixie en 1987. La version 3 de Vixie cron est sortie fin 1993. La version 4.1 a été renommée ISC Cron et est sortie en janvier 2004. Version 3, avec quelques corrections de bugs mineurs , est utilisé dans la plupart des distributions de Linux et BSD.

En 2007, Red Hat a ajouté vixie-cron 4.1 au projet cronie et a inclus anacron 2.3 en 2009.

D'autres implémentations populaires incluent anacron et dcron. Cependant, anacron n'est pas un programme cron indépendant. Une autre tâche cron doit l'appeler. dcron a été créé par le fondateur de DragonFly BSD , Matt Dillon , et sa maintenance a été reprise par Jim Pryor en 2010.

En 2003, Dale Mellor a introduit mcron, une variante de cron écrite en Guile qui offre une compatibilité croisée avec Vixie cron tout en offrant une plus grande flexibilité car elle permet d'utiliser un code de schéma arbitraire dans les calculs de planification et les définitions de tâches. Étant donné que le démon mcron et les fichiers crontab sont généralement écrits en schéma (bien que mcron accepte également les crontabs Vixie traditionnels), l' état cumulé de la file d'attente des tâches d'un utilisateur est disponible pour son code de tâche, qui peut être programmé pour s'exécuter si les résultats d'autres les emplois répondent à certains critères. Mcron est déployé par défaut sous le gestionnaire de packages Guix , qui inclut des dispositions ( services ) permettant au gestionnaire de packages d' émettre de manière monadique des crontabs mcron tout en s'assurant que les packages nécessaires à l'exécution des tâches sont installés et que les crontabs correspondants y font correctement référence.

Une solution webcron planifie les tâches en anneau pour qu'elles s'exécutent régulièrement là où les implémentations cron ne sont pas disponibles dans un environnement d' hébergement Web .

Expression CRON

Une expression CRON est une chaîne comprenant cinq ou six champs séparés par un espace blanc qui représente un ensemble d'heures, normalement comme un programme pour exécuter une routine.

Les commentaires commencent par une marque de commentaire #, et doivent être sur une ligne par eux-mêmes.

Champ Obligatoire Valeurs autorisées Caractères spéciaux autorisés Remarques
Minutes Oui 0–59 * , -
Les heures Oui 0–23 * , -
Jour du mois Oui 1–31 * , - ? L W ? L W seulement dans certaines implémentations
Mois Oui 1-12 ou JAN-DEC * , -
Jour de la semaine Oui 0-6 ou DIM-SAT * , - ? L # ? L # seulement dans certaines implémentations
Année Non 1970-2099 * , - Ce champ n'est pas pris en charge dans les implémentations standard/par défaut.

Les abréviations du mois et du jour de la semaine ne sont pas sensibles à la casse.

Dans le cas particulier du fichier système crontab (/etc/crontab), un champ utilisateur s'insère avant la commande . Il est généralement défini sur 'root'.

Dans certaines utilisations du format CRON, il y a aussi un champ de secondes au début du motif. Dans ce cas, l'expression CRON est une chaîne comprenant 6 ou 7 champs.

Virgule ( ,)
Les virgules sont utilisées pour séparer les éléments d'une liste. Par exemple, utiliser "MON,WED,FRI" dans le 5e champ (jour de la semaine) signifie les lundis, mercredis et vendredis.
Tiret ( -)
Le tiret définit les plages. Par exemple, 2000-2010 indique chaque année entre 2000 et 2010, inclus.
Pourcentage ( %)
Les signes de pourcentage (%) dans la commande, à moins qu'ils ne soient échappés avec une barre oblique inverse (\), sont remplacés par des caractères de nouvelle ligne et toutes les données après le premier % sont envoyées à la commande en tant qu'entrée standard.

Caractères non standard

Les caractères suivants sont des caractères non standard et n'existent que dans certaines implémentations de cron, telles que le planificateur Quartz Java .

L
« L » signifie « dernier ». Lorsqu'il est utilisé dans le champ du jour de la semaine, il permet de spécifier des constructions telles que "le dernier vendredi" (" 5L ") d'un mois donné. Dans le champ jour du mois, il spécifie le dernier jour du mois.
W
Le caractère « W » est autorisé pour le champ du jour du mois. Ce caractère est utilisé pour spécifier le jour de la semaine (lundi-vendredi) le plus proche du jour donné. Par exemple, si " 15W " est spécifié comme valeur pour le champ du jour du mois, la signification est : " le jour de la semaine le plus proche du 15 du mois ". Ainsi, si le 15 est un samedi, le déclencheur se déclenche le vendredi 14. Si le 15 est un dimanche, le déclencheur se déclenche le lundi 16. Si le 15 est un mardi, alors il se déclenche le mardi 15. Cependant, si "1W" est spécifié comme valeur pour le jour du mois et que le 1er est un samedi, le déclencheur se déclenche le lundi 3, car il ne "saute" pas la limite des jours d'un mois. Le caractère « W » ne peut être spécifié que lorsque le jour du mois est un seul jour, et non une plage ou une liste de jours.
Hachage ( #)
« # » est autorisé pour le champ du jour de la semaine et doit être suivi d'un nombre compris entre un et cinq. Il permet de spécifier des constructions telles que "le deuxième vendredi" d'un mois donné. Par exemple, la saisie de « 5#3 » dans le champ du jour de la semaine correspond au troisième vendredi de chaque mois.
Point d'interrogation ( ?)
Dans certaines implémentations, utilisé à la place de ' * ' pour laisser le jour du mois ou le jour de la semaine vide. D'autres implémentations de cron remplacent "?" avec l'heure de démarrage du démon cron, de sorte qu'il ? ? * * * *serait mis à jour 25 8 * * * *si cron démarrait à 8h25 et s'exécuterait à cette heure tous les jours jusqu'à ce qu'il soit redémarré.
Barre oblique ( /)
Dans vixie-cron, les barres obliques peuvent être combinées avec des plages pour spécifier des valeurs de pas. Par exemple, */5 dans le champ des minutes indique toutes les 5 minutes (voir note ci-dessous sur les fréquences). C'est un raccourci pour la forme POSIX plus verbeuse 5,10,15,20,25,30,35,40,45,50,55,00 . POSIX ne définit pas d'utilisation pour les barres obliques ; sa justification (commentant une extension BSD) note que la définition est basée sur le format System V mais n'exclut pas la possibilité d'extensions.

Notez que les fréquences en général ne peuvent pas être exprimées ; seules les valeurs de pas qui divisent uniformément leur plage expriment des fréquences précises (pour les minutes et les secondes, c'est /2, /3, /4, /5, /6, /10, /12, /15, /20 et /30 parce que 60 est également divisible par ces nombres ; pendant des heures, c'est /2, /3, /4, /6, /8 et /12 ); toutes les autres "étapes" possibles et tous les autres champs donnent des périodes "courtes" incohérentes à la fin de l'unité de temps avant qu'elle ne "se réinitialise" à la minute, seconde ou jour suivant ; par exemple, la saisie de */5 pour le champ jour s'exécute parfois après 1, 2 ou 3 jours, selon le mois et l'année bissextile ; c'est parce que cron est sans état (il ne se souvient pas de l'heure de la dernière exécution ni ne compte la différence entre elle et maintenant, nécessaire pour un comptage de fréquence précis - au lieu de cela, cron est un simple matcher de motif).

H
« H » est utilisé dans le système d'intégration continue de Jenkins pour indiquer qu'une valeur « hachée » est substituée. Ainsi au lieu d'un nombre fixe tel que ' 20 * * * *' qui signifie à 20 minutes après l'heure toutes les heures, ' H * * * *' indique que la tâche est effectuée toutes les heures à une heure indéterminée mais invariante pour chaque tâche. Cela permet d'étaler les tâches dans le temps, plutôt que de les faire toutes démarrer en même temps et se disputer les ressources.

Voir également

Les références

Liens externes