Cours Linux : Automatisation de tâches avec Cron et at
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 cronPATH
: 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
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
*/1 * * * * commande
: Toutes les minutes de toutes les heures de tous les jours de tous les mois0 10 * * 1-5 commande
: Du lundi au samedi (1-6) à 10h000 21 4,14,24 * * commande
: Les 4, 14 et 24 de chaque mois à 21h0019 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
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éerm /tmp/*.tmp
Entrée "Ctrl+D" - à 13h37 :
at 13:37
Entréerm /tmp/*.tmp
Entrée "Ctrl+D"
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 !