Cours Linux : Automatisation de tâches avec Cron et at
Cet article a été publié par Benjamin
le 15-02-09 à 17:03 dans la catégorie Cours Linux
Tags :
- Cours
- Libre
- Ubuntu
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 !
Commentaires
Merci pour ce billet ;)
Pour info il y a aussi la commande "at" (man at) qui est assez sympa et qui permet de programmer des taches à une heure et date précise.
L'avantage c'est par exemple dans le cas d'une maintenance électrique planifiée, tu poses un at avec la commande "halt" pour éteindre proprement la machine avant de débrancher la prise et cette commande ne se lance qu'une seule et unique fois, contrairement aux crontabs ;)
++
En effet, j'ai oublié de parler de la commande "at". Je vais l'ajouter d'ici peu :)
Merci Myckeul !
Et une petite présentation de anacron serait bienvenue aussi. Il me semblait que anacron ne fonctionnait pas sous Ubuntu dans les version 7.10 ou 8.04, mais c'était peut-être simplement dû à un manque d'informations...
Bonjour,
Pour la tache cron
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
On voie que dow vaut 7 ce qui corespond à dimanche, 1 étant lundi. Dans le tuto il est dit que dimanche c'est 0?
0 et 7 c'est la même chose?
Merci d'avance.
toujours intéressant, ces petits cours qui me servent d'aide mémoire dans un coin de mon bureau
si je puis me permettre, un option sur le site pour avoir une version imprimable de l'article serait pratique =)
ça y est ! J'ai compris. Est-il possible, en éditant le fichier de configuration propre à sudo, d'éteindre chaque jour l'ordinateur à heure fixe ? Ca donnerait un truc du genre :
0 17 * * * shutdown -h now
Parce que si c'est ça, j'aurais enfin accompli quelque chose d'utile...
@Malou : En effet, j'ajouterais également anacron lors de la prochaine mise à jour de cet article (demain je pense), merci :-)
@toto52 : Oui, 0 et 7 symbolisent tous les deux dimanche (je vais également le rajouter)
@nattyebola : C'est une bonne idée, je vais regarder ça d'un peu plus près. Sinon, dès que les ajouts auront été faits (anacron, at, 0-7,...), je peux te faire un PDF si tu veux.
@Lightbringer : Exactement, un coup de "sudo crontab -e", tu ajoutes ta ligne et ça marche (par contre, évite de mettre ta commande avec le mot clé @reboot) ;-)
Bonjour,
Je travaille dans une boite française qui produit un remplaçant pour cron (avec interface graphique full java, avec import de Cron, avec des algorythmes avancés de fréquence de job).
Je sais que d'après la netiquette on ne fait pas de pub dans ce genre de post. Mais, tant pis, je transgresse.
Si vous voulez en savoir plus : http://www.orsyp.com/en/solutions/job-scheduling-unijob-univiewer.html
Cdt,
Fred
C'est toujours clair, précis et cela laisse notre imagination en éveil sur ce que l'on va faire. Une fois bien expliqué je prends le risque d'essayer;
Merci encore pour toute ces précisions et pour le temps que tu prends à nous expliquer.
Bonne soirée.
Très bon article, merci ;-)
Salut,
Géniaux ces cours. Je suis en train de mettre en pratique la commande at, pour un téléchargement dont les fichiers ne seront disponibles qu'en cours de soirée...
J'utilise la commande wget -i ~/liens.txt avec le fichier ~/liens.txt qui contient les liens vers les différents morceaux d'archives...
Ca marche nickel, mais ou se trouve la sortie de ces commandes? Quand je fais wget -i fichier.txt, j'ai dans ma console un suivi de l'avancement des téléchargements.. mais avec at... rien. Pourtant, ca télécharge..
Merci de votre réponse
Chiiiiiz
Je comprend ta question mais je n'ai pas la réponse :)
Je vais tâcher de regarder ça
j'aimerais avoir un renseignement je suis tout nouveau sous linux. quand je vais la commande suivante sous ubuntu:rm -rf /home/login/.Trash .ma corbeille ne se vide pas par contre quand je vais rm -rf /home/login/.local/share/Trash/files tout ce passe bien.merci d'avance
Bonjour,
Merci pour ce tuto,
et j'aime beaucoup le graphisme du site.
-- Eko
PS: intervalle étant du genre masculin, c'est donc "à intervalles réguliers" pas régulières
slt, je suis ingenieur systemes informatiques et reseaux (en formation) à ISI(Institut Superieur Informatique) à dakar-Senegal;
et je tiens à vs remercier d'avantage pour ce tuto. et j'avoues k ca m'a bcou servi
Je suis content de voir que ce tuto sert encore à pas mal de personnes :)
Bonjour,
Tuto clair, et qui s'efforce d'être complet.
Pour être exhaustif à 100% vous devriez ajouter qu'il faut faire attention de NE PAS mélanger les jours du mois et les jours de la semaine.
Contrairement à une croyance répandue (et dont j'ai fait les frais professionnellement) crond (du moins sous Linux) va faire un OR du jour du mois et du jour de la semaine !
Par exemple, la ligne suivante :
19 8-16 1,2 2 1-6 COMMANDE
... va lancer COMMANDE - du lundi au samedi ET AUSSI les deux premiers jours du mois - de février de 8h19 à 16h19 toutes les heures (vu sur RHEL et Arch).
A tester sur votre Pingouin.
@++