Cron

1 - Présentation

 

Crontab est un outil qui permet de lancer des applications de façon régulière.

 

 

2 - Configuration

 

 

2.1 - Autorisations

 

Les fichiers /etc/cron.allow et /etc/cron.deny permettent de définir les droits d'utilisation sur crontab.

 

Voici la traduction d'une partie de la man page du crontab concernant cette fonctionnalité :

 

"Si le fichier /etc/cron.allow existe, alors vous devez être présent denas ce fichier pour être autorisé à utiliser cette commande. Si le fichier /etc/cron.allow n'existe pas mais que /etc/cron.deny existe, alors vous ne devez pas être mentionné dans le fichier /etc/cron.deny afin de pouvoir utiliser cette commande."

 

Dans le cas de la Debian-Sarge, si aucun des deux fichiers n'existe alors n'importe quel utilisateur peut utiliser crontab.

 

Pour qu'il n'y ait aucune ambiguité, je vous conseille de créer ces deux fichiers. Ensuite placer le nom des utilisateurs auxquels vous voulez donner accès à la commande crontab dans le fichier /etc/cron.allow, et placer 'all' dans le fichier /etc/cron.deny.

 

Remarque : l'utilisateur root passe outre ces fichiers, et peut même définir dans /etc/crontab des tâches pour des utilisateurs n'ayant aucun droit. En fait, les fichiers /etc/cron.allow et /etc/cron.deny gèrent l'accès à la commande crontab. Celà signifie que si un utilisateur possède une crontab et qu'ensuite on le supprime de liste de /etc/cron.allow, les tâches seront quand même effectuées. Pour évitez que cela ne se produise, vous devez supprimer la crontab de cet utilisateur située dans var/spool/cron/crontabs.

 

 

3 - Afficher la liste des actions

 

Cette commande va afficher le contenu du fichier de configuration de crontab :

 

$ crontab -l

 

 

4 - Purge des actions

 

Cette commande va purger la liste des actions à effectuer pour l'utilisateur :

 

$ crontab -r

 

 

5 - Editer les actions

 

 

5.1 - Choix de l'éditeur

 

La configuration de crontab se fait via un fichier texte. Avant de modifier ce fichier, il faut spécifier à crontab quel éditeur on veut utiliser (ici vi) :

 

$ export EDITOR=vi

 

 

5.2 - Editer les actions

 

Cette action va permettre de créer ou modifier les actions

 

$ crontab -e

 

Le fichier de configuration de est constitué des différentes lignes. Chaque ligne correspond à une action. Voici le shéma d'une ligne :

 

mm hh jj MMM JJJ tâche > log

 

* mm : minutes (00-59).

* hh : heures (00-23) .

* jj : jour du mois (01-31).

* MMM : mois (01-12 ou l'abbrévation anglaise sur trois lettres : jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec).

* JJJ : jour de la semaine (1-7 ou l'abbrévation anglaise sur trois lettres : mon, tue, wed, thu, fri, sat, sun).

* tâche : commande à exécuter.

* > log (facultatif) : redirection de la sortie vers un fichier de log. Si un fichier de log n'est pas spécifié, un mail sera envoyé à l'utilisateur local.

 

Pur chaque unité, on peut utiliser les notations suivantes :

 

* 1-4 : les unités de temps de 1 à 5.

* */15 : toutes les 15 unités de temps (toutes les quinzes minutes par exemple).

* 2,7 : les unités de temps 2 et 7.

 

 

5.2.1 - Exemples

 

Exécution tous les jours à 20h00 d'une commande :

 

00 20 * * * /chemin/vers/la/commande

 

Exécution d'une commande toutes les quinze minutes :

 

*/15 * * * * /chemin/vers/la/commande

 

Exécution d'une commande tous les lundis :

 

* * * * 1 /chemin/vers/la/commande

 

Exécution d'une commande une fois par an à une heure précise (ici le 25 décembre à 9h15) :

 

15 09 25 12 * echo "il est temps d'aller chercher les cadeaux sous le sapin!"

 

 

5.2.2 - Exemples avec gestion de la sortie

 

Par défaut, pour chaque tâche effectuée par crontab, un mail est envoyé à son utilisateur. Dans le cas d'une tâche quotidiennes ou hebdomadaire, celà ne pose aucun problème, mais si un travail est lancé toutes les 10 minutes, votre boîte mail risque d'être engorgée.

 

On va donc s'intéresser aux différentes sorties générées :

 

* La sortie standard (numéro 1) récupère les informations relatives au déroulement des programmes. Par exemple, la commande echo “affichage d'un message” renvoie “Affichage d'un message” sur la sortie standard.

* La sortie d'erreurs (numéro 2), permet, comme son nom l'indique, d'obtenir les erreurs obtenues lors de l'éxécution d'un programme.

 

Voici quelques exemples en lançant la commande fetchmail toutes les 15 minutes:

 

*/15 * * * * fetchmail 1>> ./logs/logs.crontab

 

Les erreurs (2) seront envoyées par mail, et le déroulement du programme sera loggué dans ./logs/log.crontab.

 

 

 

*/15 * * * * fetchmail 1>> ./logs/logs.crontab 2> /dev/null

 

Les erreurs (2) ne sont jamais loggées (ni envoyées par mail), et le déroulement du programme sera loggué dans ./logs/log.crontab.

 

 

 

*/15 * * * * fetchmail 1>> ./logs/logs.crontab 2>&1

 

Les erreurs (2) et le déroulement du programme seront loggués dans le fichier ./logs/log.crontab.

 

 

 

*/15 * * * * fetchmail 1> /dev/null 2> /dev/null

 

Ni la sortie standard, ni les erreurs ne sont loggés ou envoyés par mail.

 

 

6 - Crontab et le répertoire /etc/

 

Le fichier /etc/crontab se présente comme suit :

 

# m h dom mon dow user command

17 * * * * root cd / && run-parts --report /etc/cron.hourly

25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )

47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )

52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

#

 

Par suite, on remarque que la crontab se charge de lancer tous les scripts présents dans les dossiers /etc/cron.daily, /etc/cron.hourly, /etc/cron.weekly, /etc/cron.monthly via la commande run-parts. Donc si vous devez utiliser la crontab préférez privilegier la répartition des scripts dans ces répertoires si possible, et ainsi éviter d'ajouter des entrées au fichier /etc/crontab.

 

Si votre script doit être lancé toutes les 5 minutes par exemple, les répertoires mentionnés ci-dessus ne conviendront plus, vous pouvez alors vous tourner vers /etc/cron.d et y ajouter une entrée à la mode crontab.

 

Remarque : la man page de run-parts précise :

 

Si l’option --lsbsysinit n’est pas utilisée, alors les noms ne doivent être constitués que de lettres minuscules ou majuscules, de chiffres, de tirets de soulignement (« underscore ») ou de tirets."

 

En d'autres termes pas d'extension dans le nom des scripts !

 

 

7 - Ressources

 

* Programmation des tâches régulières: crontab

 

espaceur


ceydric