The Troll's factory

Geekeries & pensées
-->

Les tâches planifiées sous Linux (cron, crontab) : première approche

Mise à jour : La deuxième partie de ce guide sur les tâches planifiées, intitulée Tâches planifiées sous Linux (cron, crontab) : Seconde approche est dorénavant disponible ici : Tâches planifiées sous Linux (cron, crontab) : Seconde approche.

Article original :
Salut la compagnie,

Aujourd’hui, et malgré les touffes de poils que le Troll s’est arrachées toute la journée en se battant avec le fameux vilain cron et son accolite crontab, je vais vous parler de quelque-chose de bien utile, voire tout simplement indispensable, pour n’importe quel administrateur d’un serveur web, ou même d’un site internet (mais il est assez rare que vous ayiez la possibilité de mettre des cron sans avoir un dédié (ou au moins un VPS) ) : les tâches planifiées.

Les tâches planifiées c’est quoi ? Que vous soyiez GNU/Linuxien ou Windowsien (bouuuuuuh, bon ok, j’arrête) vous ne le savez peut-être pas mais votre système est capable de faire des choses sans que vous lui demandiez, sans que vous n’ayiez quoi que ce soit à faire, de manière automatique.

Cela s’appelle les tâches planifiées , concrètement cela signifie qu’une tâche, va être planifiée (jusque-là, vous suivez ?), et qu’une fois que c’est fait, elle s’exécutera de manière automatique soit une fois, soit plusieurs fois, suivant la manière dont on la planifie.

Planifier ? Késako ?

Tout d’abord, considérons que vous n’avez jamais eu à faire à ce genre de choses, et partons du début : Planifier ? Késako ? (si vous n’avez jamais vu ce mot… euh… je plains votre patron) Planifier, cela signifie que l’on va fixer une date, une heure, un moment précis, où l’on souhaite exécuter une tâche.

Si c’est une tâche unique, que l’on a besoin d’effectué qu’une seule fois, parce-qu’on est pas là à ce moment-là par exemple (comment que vous programmiez votre magnétoscope pour enregistrer le film débile du samedi soir (pour vos enfants bien sûr… vous, vous ne regardez rien de stupide, Arte©® Powered, n’est-ce pas ?) ).

Si c’est une tâche récurrente c’est-à-dire qu’il faudra l’exécuter régulièrement (comme faire le ménage !), dans ce cas il sera possible de la programmer de manière à ce qu’elle s’effectue de manière récurrente, toujours au même moment, à la même heure, etc. … (et de la même façon, on a à faire à des ordinateurs standards, pas d’IA encore).

Cron & Crontab : Je planifie, tu planifies…

Sous Linux, le principal outil de planification se nomme cron, et très vite nous (et vous aussi) appelerons tout simplement une tâche planifiée un cron.

Tout d’abord, avez-vous cron d’installé ? Cron est installé sur un bon 80% des distributions, donc il y a des chances. Pour le savoir tapez :

ls -l /etc/init.d/ | grep cron

Pour ceux sous archlinux, /etc/init.d c’est /etc/rc.d/ de mémoire.

Si vous êtes sous un système basé sur debian, avec aptitude :

sudo aptitude show cron

Sous Fedora :

sudo yum install cron

(si cron est déjà installé ça vous le dira, sinon, ça l’installera !!)

Comme on est pas encore sûr que cron soit déjà lancé, faisons un petit restart :

sudo /etc/init.d/cron restart

(il est possible que le fichier soit nommé « crond » chez vous)

Bon, on est prêt, cron est lancé. Maintenant que faire ?

Dans cette première partie, comme c’est écrit dans le titre, je ne vais pas vous donner toutes les « clés » de cron, nous allons simplement voir ensemble comment utiliser la commande de base, qui permet en fait à elle seule de tout faire, juste d’un manière parfois moins « propre » qu’en passant par certains fichiers un peu plus « complexes » (pas vraiment complexes en fait, mais ça vous fais manipuler des fichiers etc. etc. … puis faut être root, alors ne commençons par les bêtises tout de suite).

La commande dont vous allez dorénavant tomber amoureux est la suivante :

crontab -e

La commande crontab permet, de manière générale, de mettre à jour et modifier les tâches cron d’un utilisateur donné.

Donnons tout de même quelques précisions dessus :

- Si vous voulez remplacer la totalité de votre crontab (c’est-à-dire toutes les tâches qu’il contient, comme nous allons le voir après) par le contenu d’un fichier, utilisez la commande comme ceci :

crontab /chemin/vers/mon/fichier

- Ensuite, par défaut la commande crontab va éditer le fichier crontab de l’utilisateur courant (oui, c’est vous qui courez),  si vous voulez modifier le crontab d’un autre utilisateur (notamment pratique quand on exécute la commande en root !!)  il faut lui préciser le paramètre « -u » comme ceci :

crontab -u user

- Et puis allez, un petit dernier pour la route, pour voir le contenu de votre crontab sans l’éditer (le « -e » que nous allons voir) :

crontab -l

Les paramètres peuvent bien entendus se combiner :

crontab -l -u troll

(affiche le contenu du crontab de l’utilisateur troll (c’est moi) )

Voilà, maintenant passons aux choses sérieuses, donc, l’édition :

crontab -e

Vous voilà maintenant dans un fichier texte, ne vous souciez pas de savoir où il est ni ce que c’est, car c’est en réalité un fichier temporaire.

Vous êtes certainement (95% de chance) sous l’éditeur en console « Nano« ,  si vous savez utiliser vim (ou vi pour les courageux) et que vous êtes (comme moi) allergiques à nano, je vous file quand même la magouille :

EDITOR="vim" crontab -e

Je me contenterai pour ma part de décrire les actions à faire sous nano, supposant que si vous utilisez vim, c’est que vous savez vous en servir (vraiment trèèèès compliqué… (ironie) ).

Dans ce fichier, vous mettrez une tâche planifiée par ligne, et UNE SEULE !

Suivant la longueur de votre « ligne » cell-ci peut s’afficher sur plusieurs « lignes » en console, mais tant que vous n’avez pas mis de retour ligne (Entrée) cela reste la même ligne. Lorsque qu’une ligne est trop longue pour être affichée en plein, nano la coupe en général et met un « $ » à la fin pour vous dire que tout n’est pas affiché.

Maintenant voyons la syntaxe des « cron » :  ceux-ci sont constitués de deux parties distinctes : le moment d’exécution, et la commande à exécuter (ou tâche). Les deux parties sont séparées par un espace (comme souvent sous GNU/Linux).

Ce qui donnera donc à la fin :

partie_date partie_tache

Voyons ce qu’on met à la place de partie_date (dans l’ordre, avec un espace entre chaque donnée à chaque fois) :

  1. minute : la minute (00 à 60) de l’heure à laquelle exécuter la tâche
  2. heure : l’heure (0 à 23), de l’heure de planification de la tâche
  3. jour du mois : de 0 à 31 (ou autre, suivant les mois), le jour, dans la date de planification de la tâche
  4. mois : nombre correspondant au mois (00 à 12) de la date à laquelle vous voulez planifier.
  5. jour de la semaine : Le nom abrégé (mon, tue, wed, thu, fri, sat, sun) ou le numéro (1 à 7) du jour de la date de planification au sein de sa semaine : Lundi = 1, mardi = 2, etc…

Voilà, petit exemple, admettons que je veuille exécuter une date le 1er de l’an 2010 à une heure de l’après-midi, la partie « partie_date » sera la suivante :

00 13 01 01 fri

Vous devez avoir au total 5 données : minute heure jourdumois mois jourdelasemaine Voilà, pour la partie « date », nous nous contenterons des dates fixes dans cette première approches.

Venons-en à la tâche à éxécuter : Ici, rien de plus compliqué que de taper dans une console. Cron lira la tâche à exécuter avec bash, ce qui signifie qu’il le lira de la même manière (enfin presque) qu’il lit les choses quand vous, vous tapez dans la console.

Un petit détail cependant : mettez toujours toutes les commandes en chemin ABSOLU ! ! ! Même les commandes qui paraissent évidentes et qui sont dans /usr/sbin, rajoutez bien le /chemin/vers/mon/fichier . ;)

Ce qui vous donnera, une fois les deux parties remplies :

minute jour jourdumois mois jourdelasemaine /chemin/vers/ma/commande

Maintenant que vous avez écrit votre tâche planifiée, il n’y a plus qu’à enregistrer et fermer !

Pour ça, faites CTRL + X, puis appuyez sur « O » pour répondre oui à la question, et enfin appuyez sur ENTREE pour confirmer votre « oui ».

Sous vi/vim : sortez du mode édition (CTRL + C) puis tapez le traditionnel :wq

Voilà, je vous écris très prochainement la partie suivante : seconde approche.

On y abordera : les jokers, les répétitions, les sélections multiples dans les dates.

Dans les tâches : comment gérer leur sortie et enregistrer leurs résultats et leurs erreurs, ou au contraire ne pas le faire, et ne pas recevoir de « mail » du logger. On parlera peut-être également de la modification manuelle des fichiers cron auxquels la commande « crontab » ne touche pas. Petite note : si vous avez un quelconque problème avec ces explications, laissez un comm’ pour demander de l’aide ;-)

Mise à jour : La deuxième partie de ce guide sur les tâches planifiées, intitulée Tâches planifiées sous Linux (cron, crontab) : Seconde approche est dorénavant disponible ici : tâches planifiées sous Linux (cron, crontab) : Gestion et commandes avancées.

Share and Enjoy:
  • Print
  • PDF
  • Twitter
  • Facebook
  • LinkedIn
  • RSS
  • Wikio FR
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Technorati
  • Sphinn
  • Mixx
  • Add to favorites
  • Live
  • Netvibes
  • Scoopeo
  • viadeo FR
  • Identi.ca
  • MySpace
  • StumbleUpon
  • Yahoo! Buzz
posté par Troll dans Administration serveur,Geekeries avec 10 commentaires

10 réponses à “Les tâches planifiées sous Linux (cron, crontab) : première approche”

  1. KyleK dit :

    Le nombre de tutos que j’ai du fouillé avant d’en trouver un qui donne la syntaxe pour remplacer tout le crontab.

    Nickel ! Merci beaucoup.

    Contenu complet dans un contenant somptueux, c’est un chouette site.

  2. Troll dit :

    Merci pour le compliment ;)

    Au plaisir que ça serve :)

  3. c24b dit :

    Génial ce tuto vraiment très utile!
    Merci!

  4. Troll dit :

    Pareil que précédemment :

    Merci pour le compliment (un merci, ça fait toujours plaisir !) et au plaisir que ça serve ! :)

  5. spipfactory dit :

    Excellent tuto, car je rame je rame depuis des mois.

    mais malgré tous ça je n’arrive a rien et je pense que c’est l’histoire du chemin que je n’ai pas compris.

    soit des plugins qu’il faut maintenir a jour, ce situant dans 2 répertoires différents

    /var/www/mutu_escal/plugins-dist
    et
    /var/www/mutu_escal/plugins

    je créer donc mon fichier cron de la manière suivante

    MAILTO= »@ » –>afin de recevoir par mail les infos
    00 21 * * * /usr/bin/svn up /var/www/mutu_escal
    –>met à jour le spip
    10 21 * * * /usr/bin/svn up extensions/* /var/www/mutu_escal
    –>mettra à jour toutes les extensions
    20 21 * * * /usr/bin/svn up plugins/* /var/www/mutu_escal
    –>mettra à jour tous les plugins

    la par contre je suis vraiment pas sur du coup
    30 21 * * * /usr/bin/rm -fr tmp/cache/* /var/www/tmp/cache –>effacera tout le contenu du dossier tmp/cache

    ça donne rien , je reçoit un joli mail me disant
    Skipped ‘plugins/*’
    Skipped ‘/var/www/mutusarka’

    pourriez vous s’il vous plait me réorienter
    merci

    j’en profite pour referencer votre site : http://spipfactory.com/?-Geek-and-Informatik

  6. Troll dit :

    Salut,

    Ton pb ici n’est pas vraiment avec cron mais plutôt svn je pense.

    Quand tu fais :

    /usr/bin/svn up extensions/* /var/www/mutu_escal

    et :

    /usr/bin/svn up plugins/* /var/www/mutu_escal

    Je pense que ce que tu veux en fait faire c’est :

    /usr/bin/svn up /var/www/mutu_escal/extensions/* 

    et :

    /usr/bin/svn up /var/www/mutu_escal/plugins/*

    Quant à :

    /usr/bin/rm -fr tmp/cache/* /var/www/tmp/cache

    Je pense que tu veux en fait faire :

    /usr/bin/rm -fr /var/www/tmp/cache/*

    Cela résout-il on souci ?

    Troll

    PS : OK pr le référencement du blog… ça me va. :)

  7. spipfactory dit :

    Hello
    Aprés avoir lu et relu je m’en suis sortie ;)

    si ça peu servir :
    je lance donc ma tache cron un fois par jour soit :
    etc/cron.daily/tache_a_lancer

    on constate que 2 script sont lancé dans un ordre précis


    #!/bin/bash
    DOCUMENT_ROOT=/home/www/spipfactory/script-sh
    ${DOCUMENT_ROOT}/svn-up 01-svn-up
    ${DOCUMENT_ROOT}/sauv-img 02-sauv

    et donc ou je coincé svn-up


    #! /bin/bash
    DOCUMENT_ROOT=/home/www/spipfactory/public_html
    svn up ${DOCUMENT_ROOT}/*
    svn up ${DOCUMENT_ROOT}/plugins-dist/*
    svn up ${DOCUMENT_ROOT}/plugins/*
    svn up ${DOCUMENT_ROOT}/plugins-spipfactory/*

    et voilà tous mes fichiers sont mis a jour une fois par jour.
    Merci pour cet excellent tuto qui m’a permis de résoudre un pb vieux de plusieurs mois

    @micalement spipfactory.com

  8. Troll dit :

    De rien ! Content que ça serve !

  9. vrousselot dit :

    Merci pour la qualité du Tuto!

    On s’initie progressivement, et efficacement.

    A bientôt pour de nouveaux sujets.

    Vivien

  10. CRISTINE dit :

    Bonjour,
    Excellent travail Merci.

    je travail sur un logiciel de calcul R
    J’ai fait mon script nomé : code.R

    je travaille sur linux débian

    lorsque j’ouvre le terrminal et je tape soit:
    R CMD BATCH code.R ou bien Rscript code.R ça fonctionne parfaitement mais je voudrai faire ça à l’aide d’une tache cron

    donc j’ai fait:
    crontab-e
    */01 **** Rscript code.R
    aprés j’ai enregestré ce cron mais elle ne fonction pas autrement-dit j’ai pas eu de résultat de mon code

    merci pour votre aide

Poster un commentaire

Remplissez le formulaire suivant pour poster un message.
Nom
Email
Site internet
Votre commentaire