Table of Contents
cron/crontab
Cron est un programme qui permet, sous Unix, d'automatiser des tâches en les programmant pour se lancer à une heure/date précise (l'équivalent du planificateur de taches sous Windows). On distingue le démon crond et l'utilitaire de configuration crontab.
Chaque utilisateur peut utiliser cron ; on peut limiter l'accès à l'utilitaire en créant/complétant les fichiers /etc/cron.allow
(et /etc/cron.deny
) des noms d'utilisateurs adéquats. Le fichier cron.allow
est prioritaire à cron.deny
.
Pour utiliser cron, on utilise crontab
, l'utilitaire d'édition et de vérification syntaxique des fichiers de configuration.
On peut lister, editer ou supprimer (remove) ce fichier de conf :
crontab [-u user] {-l e r}
L'option -u
permet au root d'accéder à celui d'un autre utilisateur.
Quand on édite un fichier de configuration - on utilise donc crontab -e
- on obtient un éditeur de texte fonctionnant comme vi. En une phrase, cet utilitaire fonctionne ainsi :
- i pour rentrer en mode insertion (pour écrire)
- echap pour rentrer en mode commande
- echap puis :wq pour sauvegarder et quitter
- echap puis :q! pour quitter sans sauvegarder
La syntaxe du fichier est la suivante : # m h dom mon dow command
qui signifie respectivement minute, hour, day of month, month, day of week, et commande (il faut au moins un espace ou une tab entre chaque colonne). Les intervalles sont naturels, sauf pour la colonne dow qui va de 0 (dimanche) à 6 (samedi). 7 vaut également dimanche, pour des problèmes de compatibilité.
Il existe des méta-caractères :
- * tous
- / spécifie une répétition
- - définit une plage
- , spécifie plusieurs valeurs
Donc, en résumé :
- on lance la commande
crontab -e
- on entre en mode insertion :
i
- on modifie le fichier à sa guise (cf exemples plus bas)
- on sauvegarde et on quitte :
<echap> :wq
On obtient une confirmation de la prise en compte de la modification :
crontab: installing new crontab
Voici des exemples (toujours 1 ligne par commande).
- Lancer script.sh tous les jours à 2h :
0 2 * * * ./script.sh
- Lancer mrtg avec un paramètre toutes les 5 min :
*/5 * * * * mrtg /var/www/mrtg/mrtg.cfg
- lancer script.sh du lundi au vendredi à 23h :
0 23 * * 1-5
- lancer script.sh les 1 et 15 du mois à 23h :
0 23 1,15 * *
Il existe des chaînes de caractères spéciales :
@reboot
: exécution une fois au démarrage@yearly
: exécution une fois par an, “0 0 1 1 *”@annually
: exécution une fois par an, “0 0 1 1 *”@monthly
: exécution une fois par mois, “0 0 1 * *”@weekly
: exécution une fois par semaine, “0 0 * * 0”@daily
: exécution une fois par jour, “0 0 * * *”@midnight
: execution une fois par jour, “0 0 * * *”@hourly
: execution une fois par heure, “0 * * * *”
Le root peut (et doit même) utiliser le répertoire /etc/cron.*
afin de centraliser toutes les commandes en crontab (sinon disséminées dans des fichiers obscurs). La syntaxe est la même qu'une crontab éditée avec crontab -e
, à ceci près qu'on ajoute un champ user avant la commande, pour préciser l'identité sous laquelle sera lancée la commande ; par exemple pour lancer sous l'identité de “dude” :
*/10 * * * * dude echo "pwet"
Tips
Utilisation du "%"
Lorsqu'on utilise une commande contenant des %
dans une crontab, comme la commande date
par exemple :
01 00 * * * root echo "Bonjour, nous sommes le `date +%Y-%m-%d`" >> /root/horloge_parlante.log
… elle génère inévitablement un message d'erreur du style :
/bin/sh: -c: ligne 0: caractère de fin de fichier (EOF) prématuré lors de la recherche du « ` » correspondant
Le problème vient du fait que le caractère %
est interprété par cron comme un saut de ligne. Pour utiliser ce caractère dans une crontab, il faut le protéger en le précédant d'un \
:
01 00 * * * root echo "Bonjour, nous sommes le `date +\%Y-\%m-\%d`" >> /root/horloge_parlante.log