Product SiteDocumentation Site

9.7. Planification de tâches : cron et atd

cron est le démon en charge d'exécuter des commandes planifiées et récurrentes (chaque jour, chaque semaine, etc.) ; atd est celui qui s'occupe des commandes à exécuter une seule fois, à un instant précis et futur.
Dans un système Unix, de nombreuses tâches sont régulièrement planifiées :
Par défaut, tous les utilisateurs peuvent planifier l'exécution de tâches. C'est pourquoi chacun dispose de sa propre crontab, où il peut consigner les commandes à planifier. Il peut la modifier en exécutant crontab -e (ses informations sont stockées dans le fichier /var/spool/cron/crontabs/utilisateur).
L'utilisateur root dispose de sa crontab personnelle, mais peut également employer le fichier /etc/crontab ou déposer des crontab supplémentaires dans le répertoire /etc/cron.d/. Ces deux dernières solutions ont l'avantage de pouvoir préciser l'utilisateur sous l'identité duquel exécuter la commande.
Le paquet cron propose par défaut des commandes planifiées qui exécutent :
De nombreux paquets Debian profitent de ce service : en déposant dans ces répertoires des scripts de maintenance, ils assurent le fonctionnement optimal de leur service.

9.7.1. Format d'un fichier crontab

Chaque ligne significative d'une crontab décrit une commande planifiée grâce aux six (ou sept) champs suivants :
  • la condition sur les minutes (nombres compris de 0 à 59) ;
  • la condition sur les heures (de 0 à 23) ;
  • la condition sur le jour du mois (de 1 à 31) ;
  • la condition sur le mois (de 1 à 12) ;
  • la condition sur le jour de la semaine (de 0 à 7, le 1 correspondant au lundi — le dimanche est représenté à la fois par 0 et par 7 ; il est également possible d'employer les trois premières lettres du nom du jour en anglais comme Sun, Mon, etc.) ;
  • le nom d'utilisateur sous lequel la commande devra s'exécuter (dans le fichier /etc/crontab et dans les fragments déposés dans /etc/cron.d/, mais pas les crontabs des utilisateurs) ;
  • la commande à exécuter (quand les conditions définies par les cinq premières colonnes sont remplies).
Tous les détails sont documentés dans la page de manuel crontab(5).
Chaque condition peut s'exprimer sous la forme d'une énumération de valeurs possibles (séparées par des virgules). La syntaxe a-b décrit l'intervalle de toutes les valeurs comprises entre a et b. La syntaxe a-b/c décrit un intervalle avec un incrément de c (exemple : 0-10/2 correspond à 0,2,4,6,8,10). Le joker * représente toutes les valeurs possibles.

Exemple 9.2. Exemple de crontab

#Format
#min heu jou moi jsem commande

# Télécharge les données tous les soirs à 19:25
 25  19  *   *   *    $HOME/bin/get.pl

# Le matin à 8:00, en semaine (lundi à vendredi)
 00  08  *   *   1-5  $HOME/bin/fait_quelquechose

# Redémarre le proxy IRC après chaque reboot
@reboot /usr/bin/dircproxy

9.7.2. Emploi de la commande at

La commande at prévoit l'exécution d'une commande à un moment ultérieur. Elle prend l'horaire et la date prévus en paramètres sur sa ligne de commande, et la commande à exécuter sur son entrée standard. La commande sera exécutée comme si elle avait été saisie dans un interpréteur de commandes. at conserve d'ailleurs l'environnement courant afin de pouvoir travailler exactement dans les mêmes conditions que celles de la planification. L'horaire est indiqué en suivant les conventions habituelles : 16:12 représente 16 h 12. La date peut être précisée au format JJ.MM.AA (27.07.15 représentant ainsi 27 juillet 2015) ou AAAA-MM-JJ (cette même date étant alors représentée par 2015-07-27). En son absence, la commande sera exécutée dès que l'horloge atteindra l'heure signalée (le jour même ou le lendemain). On peut encore écrire explicitement today (aujourd'hui) ou tomorrow (demain).
$ at 09:00 27.07.15 <<FIN
> echo "Penser à souhaiter un bon anniversaire à Raphaël" \
>   | mail lolando@debian.org
> FIN
warning: commands will be executed using /bin/sh
job 31 at Mon Jul 27 09:00:00 2015
Une autre syntaxe permet d'exprimer une durée d'attente : at now + nombre période. La période peut valoir minutes, hours (heures), days (jours) ou weeks (semaines). Le nombre indique simplement le nombre de ces unités qui doivent s'écouler avant exécution de la commande.
Pour annuler une tâche planifiée pour cron, il suffit, lors d'un appel à crontab -e, de supprimer la ligne correspondante dans la crontab où la tâche est définie. Pour les tâches at, c'est à peine plus complexe : il suffit d'exécuter la commande atrm numéro-de-tâche. Le numéro de tâche est indiqué par la commande at lors de la planification mais on pourra le retrouver grâce à la commande atq, qui donne la liste des commandes actuellement planifiées.