Cron est un programme disponible sur les systèmes de type Unix (Linux, Mac Osx ...) permettant de planifier des taches régulières. Il est en effet intéressant que les tâches habituelles soient réalisées automatiquement par le système plutôt que d’avoir à les lancer manuellement en tant qu’utilisateur.
Cron est un démon, il tourne donc en tâche de fond du système. Il peut donc être arrêté, démarré ou redémarrer avec la commande :
- /etc/init.d/cron start|stop|restart
Où Cron trouve-t-il les tâches à effectuer
Les tâches Cron peuvent être programmées par l’installation de logiciels ou par les utilisateurs.
Les logiciels installés nécessitant des tâches planifiées les mettent dans les répertoires suivants :
- /etc/cron.d
- /etc/cron.hourly
- /etc/cron.daily
- /etc/cron.weekly
- /etc/cron.monthly
Comme leur noms l’indiquent les 4 derniers répertoires définissent un intervalle de temps entre les tâches : chaque heure, chaque jour, chaque semaine, chaque mois.
Chaque fichier de ces répertoires sont des scripts (en général bash) qui seront exécutés.
Par exemple, Apache2 installe un fichier /etc/cron.daily/apache2
lançant chaque jour le nétoyage de son cache.
Les fichiers définissant les tâches Cron par utilisateur sont situés dans le répertoire /var/spool/cron
. Ils ne doivent pas être modifiés directement mais via la commande crontab
Il existe également un fichier /etc/crontab
qu’il n’est pas recommandé de modifier, mais plutôt d’utiliser la méthode précédente (tâches de l’utilisateur).
La syntaxe des fichiers de Cron
Une tâche planifiée dans un fichier de Cron est composée de 3 données différentes :
- Sa période de répétition définie par 5 données différentes :
- Les minutes ;
- Les heures ;
- Les jours dans le mois ;
- Les mois ;
- Les jours de la semaine ;
- L’utilisateur système sous lequel la tâche sera réalisée ;
- La commande à réaliser ;
Une commande complète ressemblera donc à :
- 59 23 * * * root /home/backup/backup.cmd &> /dev/null
NB : Dans un fichier de Cron pour un utilisateur en particulier (en utilisant crontab), le nom d’utilisateur ne doit pas figurer puisque les actions seront réalisées sous l’utilisateur auquel appartient ce fichier.
Définition de la périodicité
La périodicité est définie en séparant les 5 unités temporelles (minutes/heures/jours dans le mois/mois/jours de la semaine).
Pour chacune de ses unités, les syntaxes suivantes sont utilisables :
- * : représente chaque unité de temps ;
- 5 : représente une unité de temps particulière, ici la cinquième ;
- 5-10 : représente un intervale, chaque unités entre 5 et 10 soit 5,6,7,8,9,10 ;
- */5 : représente un cycle défini, ici toutes les toutes les 5 unités soit 0,5,10,15... ;
- 5,10 : représente une série définie, 5 et 10 ;
NB : spécifier les jours peut se faire sur deux valeurs, les jours du mois ou les jours de la semaine, si les deux sont spécifiés, ils sont cumulatifs, les deux seront exécutés.
Le tableau suivant montre quelques exemples :
min | heure | jour/mois | mois | jour/semaine | Périodicité |
---|---|---|---|---|---|
* | * | * | * | * | Toutes les minutes |
30 | 0 | 1 | 1,6,12 | * | à 00:30 le premier janvier, juin et décembre |
0 | 20 | * | 10 | 1-5 | à 20:00 chaque jour de la semaine (du lundi au vendredi) d’octobre |
0 | 0 | 1,10,15 | * | * | à minuit les premiers, dixièmes, et quinzième jours de chaque mois |
5,10 | 0 | 10 | * | 1 | à 00:05 et 00:10 chaque lundi et le 10 de chaque mois |
Il existe également certains raccourcis décris dans ce tableau :
Raccourcis | Description | Équivalent |
---|---|---|
@reboot | Au démarrage du système | 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 * * * * |
Le Cron des utilisateurs
Chaque utilisateur du système peut avoir sa propre liste de tâches planifiées. Le moyen le plus simple pour les utiliser est d’utiliser crontab
.
Lister sa liste de tâches
La commande suivante affichera la liste des tâches Cron de l’utilisateur en cours :
- crontab -l
Éditer sa liste de tâches
Pour éditer sa liste de tâches, l’utilisateur utilisera la commande :
- crontab -e
La liste des tâches pour un utilisateur a la même syntaxe que vu précédemment, seul le nom de l’utilisateur ne doit pas figurer puisque la tâche sera réalisée avec l’utilisateur en cours.
NB : Cette commande ouvrira sa table de cron en utilisant l’éditeur indiqué dans les variables d’environnement VISUAL
ou EDITOR
. Si aucun éditeur n’est spécifié, il utilisera l’éditeur par défaut du système /usr/bin/editor
(qui est un lien symbolique vers le bon logiciel).
Modifier la table de cron d’un autre utilisateur
Il est possible de modifier les tâches Cron d’un autre utilisateur si on en a les droits bien entendu (cas du super utilisateur) en spécifiant dans la commande le nom de l’utilisateur avec l’option -u
.
Ainsi la commande suivante modifiera la table de l’utilisateur autre_user
:
- crontab -u autre_user -e
Limiter les tâches Cron à certains utilisateurs
Il est possible de limiter les tâches Cron à certains utilisateurs particuliers ou d’interdire certains utilisateurs à en avoir.
Pour ce faire, en fonction du besoin, on peut créer un des deux fichiers suivants :
-
/etc/cron.allow
qui, s’il existe limitera la possibilité d’avoir des tâches cron aux utilisateurs listés ; -
/etc/cron.deny
qui, s’il existe interdira la possibilité d’avoir des tâches cron aux utilisateurs listés ;
Ces deux fichiers n’existent pas à l’installation, il est donc nécessaire de les créer manuellement si besoin.
Les notifications du Cron
Par défaut, à la réalisation d’une tâche du crontab, Cron envoie un email de notification à l’utilisateur en question contenant la sortie complète du script exécuté.
Pour certaines utilisation, cette notification est importante car permet de savoir si les actions se sont passées correctement. Cependant dans d’autres cas, cela peut se révéler ennuyant, surtout si les tâches sont réalisées sur des périodes courtes et donc envoyant des emails en rafale.
La suppression de la notification pour une tâche en particulier
Pour empêcher une tache particulière d’envoyer un email, il suffit d’ajouter à la fin de la commande une directive lui demandant de rediriger la sortie vers rien (/dev/null
), il est possible de le réaliser de deux manières :
- en ajoutant
> /dev/null 2>&1
à la fin de la commande ; - en ajoutant
&> /dev/null
à la fin de la commande ;
Le résultat pour ces deux cas est identique, vous ne recevrez plus de mail de notification concernant cette tâche.
Voici un exemple complet :
- 59 23 * * * root /home/backup/backup.cmd &> /dev/null
Ou :
- 59 23 * * * root /home/backup/backup.cmd > /dev/null 2>&1
La suppression complète des notifications pour un utilisateur
Pour supprimer complètement les notifications par mail pour un utilisateur, il suffit d’utiliser la variable MAILTO
dans son crontab.
Au début du fichier de crontab (avant la définition des tâches), il suffit donc d’ajouter la ligne :
- MAILTO=""
Il est également possible d’utiliser cette variable pour envoyer les notifications sur un compte email différent que celui, local, de l’utilisateur en cours. Pour ce faire il suffit d’indiquer un email spécifique :
- MAILTO="utilisateur@domaine.tld"