Crontab
Crontab est le nom du programme sous Unix (et Linux) qui permet d’éditer des tables de configuration du programme cron. Ces tables spécifient les tâches à exécuter et leur horaire d’exécution avec possibilité d’horaire périodique. Par extension, on appelle souvent « tâche cron » (ou cron job en anglais) toute tâche lancée à horaire périodique.
Les 2 commandes principales pour gérer les crontab sont :
Lister la crontab
crontab -l
Editer la crontab – lance l’éditeur de texte par défaut (vi, vim, nano etc…)
crontab -e
NB : il est nécessaire de disposer d’un script exécutable qui sera la tache lancée par le crontab. Ce script nécessite au minimum les droits d’exécution pour l’utilisateur qui lance la tache
NB2 : il doit aussi avoir comme première ligne, le sha-bang # et le shell utilisé pour s’exécuter (ex : !/bin/sh).
Plus d’infos sur l’exécution d’un script linux.
Fonctionnement de Crontab
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, …)
- 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, …) - 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 sont possibles:
- * : a chaque unité de temps
- 2-5 : les unités de temps (2,3,4,5)
- */3 : toutes les 3 unités de temps (0,3,6,…)
- 5,8 : les unités de temps 5 et 8
- 7-19/1 : toutes les 1 unites de temps de 7 à 19
Enfin il est possible de remplacer toutes les unités de temps par @reboot afin d’effectuer la commande au redémarrage de la machine :
@reboot /root/test.sh
Exemples de tâche cron
Une tâche qui se lance tous les jours à 23H30 :
30 23 * * * /root/test.sh
Une tâche qui se lance toutes les heures, passées de 5 minutes :
5 * * * * /root/test.sh
Une tâche qui se lance tous les premiers du mois à 23h30 :
30 23 1 * * /root/test.sh
Une tâche qui se lance tous les quarts d’heure :
15,30,45,0 * * * /root/test.sh
ou de cette manière :
*/15 * * * /root/test.sh
Une tâche qui se lance tous les lundis à 22h28 :
28 22 * * 1 /root/test.sh
Une tâche qui se lance toutes les 2 minutes :
*/2 * * * * /root/test.sh
Une tâche qui se lance toutes les 2 heures:
0 */2 * * * /root/test.sh
Une tâche qui se lance tous les jours pairs du mois à 23h59 :
59 23 */2 * * /root/test.sh
Particularités Debian !
Debian introduit quelques modifications a cron qui n’étaient pas disponibles en amont à l’origine. Les modifications les plus significatives introduites sont :
- gestion des répertoires /etc/cron.{hourly,daily,weekly,monthly} par l’intermédiaire de /etc/crontab
- gestion de /etc/cron.d (répertoire de dépôt des crontabs de paquet)
- modifications et corrections pour l’heure d’été et autres problèmes d’heures
- exécution de crontab avec les privilèges du groupe crontab au lieu de ceux du superutilisateur
- emplacement des fichiers et commandes spécifiques a Debian
- configuration spécifique a Debian (/etc/default/cron)
- nombreuses autres fonctionnalités plus petites et corrections
La prise en charge de /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly et /etc/cron.monthly est fournie dans Debian a l’aide des réglages par défaut du fichier /etc/crontab. Le fichier système crontab par défaut contient quatre taches, exécutées toutes les heures, tous les jours, toutes les semaines, et tous les mois. Chacune de ses taches exécutera run-parts avec chaque répertoire en argument. Ces taches sont désactivées si anacron est installé (sauf la tache exécutée toutes les heures) pour éviter les conflits entre les deux démons.
run-parts exécute tous les fichiers exécutables situés dans répertoire, et dont le nom satisfait les contraintes décrites ci-dessous.
En effet, conformément à la description précédente, les fichiers de ces répertoires doivent vérifier quelques propriétés, parmi lesquelles :
- être exécutable
- appartenir au superutilisateur
- ne pas être accessible en écriture au groupe ni aux autres
- s’il s’agit de liens symboliques, pointer vers des fichier appartenant au superutilisateur
De plus, les noms de fichier doivent respecter les exigences de run-parts : ils ne doivent contenir que des caractères alphanumériques : des tirets bas (<< _ >>) et des traits d’union (<< - >>).
NB : Les fichiers ne respectant pas ces exigences ne seront pas exécutés par run-parts. Par exemple, les fichiers dont le nom contient un point seront ignorés !
Le but est d’éviter que cron exécute des fichiers laissés par le gestionnaire de paquet Debian lorsqu’il traite les fichiers de /etc/cron.d/ comme des fichiers de configuration (c’est-a-dire les fichiers qui se terminent par .dpkg-dist, .dpkg-orig et .dpkg-new).