Cours Linux : Automatisation de tâches avec Cron et at

Parfois, il est nécessaire (ou du moins appréciable) d'exécuter une commande à intervalles régulières (vidage de la corbeille par exemple). Pour cela, il existe un logiciel qui est capable d'automatiser cette tâche : cron.

Dans ce cours, je vais vous présenter ce logiciel, ses possibilités ainsi que sa configuration.


I. Présentation

Cron est un logiciel (plus précisément un démon) intégré dans tout système Unix qui permet d'exécuter une commande à intervalles régulières avec un réglage extrêmement précis. Par exemple, vous pouvez  sauvegarder vos fichiers de configuration tous les 2 jours à 13h37 sauf le dimanche et le lundi (c'est un exemple comme un autre).

Cron est donc un programme qui tourne en arrière-plan en attendant qu'un évènement spécifié dans son ficher de configuration (crontab) se réalise.


II. Utilisation, configuration

Comme je l'ai dit ci-dessus, tout se passe dans le fichier de configuration : /etc/crontab
Analysons-le d'un peu plus près :

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# 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 )
#

    */1 *   * * *   root    sh /etc/acpi/eeepc/eeepc-fan-control.sh


La ligne SHELL et PATH correspondent aux variables d'environnement du même nom.

/bin/sh : le shell utilisé par cron
PATH : Correspond au $PATH utilisé par Cron (voir le cours sur le $PATH)

Ensuite, nous avons l'en-tête de la configuration des tâches répétitives, voici les significations des abréviations :

  • m : minutes (de 0 à 59)
  • h : heures (de 0 à 23)
  • dom : jour du mois (de 1 à 31)
  • mon : mois (1 à 12 ou jan, feb, mar, ...)
  • dow : jour de la semaine (0 ou 7=dimanche, 1=lundi, 2=mardi, ...)
  • user : utilisateur qui exécutera la commande
  • command : la commande à exécuter
Maintenant que vous connaissez la syntaxe, nous allons pouvoir ajouter une commande. Cependant, il ne faut pas éditer le fichier /etc/crontab directement. Nous allons utiliser la commande crontab.
En premier lieu, lançons cette commande en utilisateur lambda : crontab -l (L minuscule)
Nous devrions obtenir ce résultat : no crontab for login
On s'aperçoit qu'aucune exécution n'est prévue pour l'instant, nous allons donc en créer une.

Pour reprendre notre exemple d'introduction, nous voulons vider la corbeille tous les jours à 13h37 (concrètement, cela revient à supprimer l'intégralité du dossier /home/login/.Trash).
Tapez donc cette commande dans votre console : crontab -e (cette commande sert à éditer un fichier de configuration propre à l'utilisateur)

Après avoir choisi un éditeur de texte, vous obtenez l'en-tête habituelle :

# m h dom mon dow  command

Ajoutons maintenant cette commande :

37 13 * * * rm -rf /home/login/.Trash : tous les jours de tous les mois à 13h37, on exécute rm -rf /home/login/.Trash

Cette commande sera donc exécutée automatiquement avec les privilèges de l'utilisateur. Si vous devez exécuter une commande nécessitant les droits root, exécutez simplement cette commande : sudo crontab -e puis, ajoutez votre ligne de configuration.

Voici la syntaxe de configuration ainsi que différents exemples :

  • * : Tous (en fonction de la colonne où elle est placée, tous les jours, tous les mois, toutes les heures, ....)
  • / : Répetition
  • - : Intervalle
  • , : Plusieurs valeurs
Quelques exemples :
  • */1 * * * * commande : Toutes les minutes de toutes les heures de tous les jours de tous les mois
  • 0 10 * * 1-5 commande : Du lundi au samedi (1-6) à 10h00
  • 0 21 4,14,24 * * commande : Les 4, 14 et 24 de chaque mois à 21h00
  • 19 8-16/1 * 1,2 1-6 commande : Toutes les heures de 8h à 16h, à la 19ème minute, en Janvier et Février tous les jours sauf le dimanche
Bon, je pousse le bouchon un peu loin, mais c'est pour vous montrer la finesse de configuration de cron.
Pour simplifier les choses, il existe des mots clés correspondant aux utilisations "basiques" de cron (syntaxe : mot_clé commande) :
  • @hourly : une fois par heure
  • @daily :  une fois par jour
  • @weekly : une fois par semaine
  • @monthly : une fois par mois
  • @yearly : une fois par an
  • @reboot : au redémarrage de la machine

Une deuxième méthode, peut-être plus simple mais moins sophistiquée (pléonasme quand tu nous tient) consiste à créer un script shell contenant votre commande et de le copier, au choix, dans le répertoire /etc/cron.daily, /etc/cron.weekly ou /etc/cron.monthly.
Je vous invite, maintenant que vous connaissez la syntaxe de cron, à revenir en haut de cet article et de regarder les lignes du fichier /etc/crontab afin de voir quand s'exécute chacun des scripts contenus dans ces répertoires.

III. Programmation occasionnelle d'une seule tâche avec at

Voici une commande bien pratique que j'avais oublié de présenter (merci Myckeul) : la commande at. Si vous souhaitez effectuer une action particulière dans la journée (par exemple dans 15 minutes ou à une heure précise), vous n'utiliserez pas cron (car il n'y a pas de répétition, c'est juste une exécution unique programmée) mais il faudra utiliser la commande at.

Pour utiliser la commande at : Dans une console, tapez at *** (*** étant le temps souhaité, voir la liste plus bas) puis entrée. Vous obtenez un prompt at>, tapez la commande que vous souhaitez exécuter puis entrée. Vous pouvez désormais taper une deuxième commande qui sera exécuté ou "Ctrl+D" afin de signifier que la série de commandes est terminée.

Démonstration par l'exemple :
Je souhaite supprimer tous les fichiers *.tmp du répertoire tmp :

  • dans 2 minutes : at now + 2 minutes Entrée rm /tmp/*.tmp Entrée "Ctrl+D"
  • à 13h37 : at 13:37 Entrée rm /tmp/*.tmp Entrée "Ctrl+D"
Une fois la commande tapée, vous obtenez ces lignes :
at> <EOT>
job 1 at Tue Feb 17 12:41:00 2009


Votre commande sera donc exécutée le 17 février à 12h41 (dans mon exemple) avec pour numéro de job 1 (identifiant de la commande).
Pour voir les exécutions programmées, tapez la commande atq et pour supprimer une exécution tapez atrm -V job (où job est le numéro de job ;-)

C'est simple non ?


Voila, j'en ai fini avec ce cours, si vous avez des remarques ou des ajouts à faire (par exemple, certaines commandes à automatiser), je suis preneur. Enfin, si vous avez des idées ou des suggestions pour les prochains cours Linux, j'accepte avec grand plaisir :)

A bientôt !

Vus : 292
Publié par Génération Linux : 126