vendredi 15 avril 2011

Crontab

Crontab est le nom du programme sous Unix (ou Linux) qui permet d'éditer des tables de configuration du programme cron.
Par extension, on appelle souvent cron (ou cron job en anglais) toute application lancée à horaire fixe.
La commande crontab édite en fait un fichier relatif à l'utilisateur qui l'exécute, et en vérifie la syntaxe
Afin d'afficher le contenu de la table cron (pour l'utilisateur courant), il suffit d'exécuter la commande suivante :

$ crontab -l


Modification


Afin d'éditer la table cron (pour l'utilisateur courant), il suffit d'exécuter la commande suivante :

$ crontab -e

Cette commande a pour effet de lancer l'éditeur par défaut

présentant la table actuelle (donc aucune s'il s'agit du premier lancement de crontab). Cette commande ne permet pas de modifier la crontab centralisée (/etc/crontab). Ne pas oublier d'exporter l'éditeur : pour vi lancer la commande suivante :

$ export EDITOR=vi

Chaque entrée de la table (chaque ligne) correspond à une tâche à exécuter et est notée de la façon suivante :

mm hh jj MMM JJJ tâche > log

Dans cette syntaxe :

    * mm représente les minutes (de 0 à 59)
    * hh représente l'heure (de 0 à 23)
    * jj représente le numéro du jour du mois (de 1 à 31)
    * MMM représente le numéro du mois (de 1 à 12) ou l'abréviation du nom du mois (jan, feb, mar, apr, ...)
    * JJJ représente l'abréviation du nom du jour ou le chiffre correspondant au jour de la semaine (0 représente le dimanche, 1 représente le lundi, ..., 7 représente le dimanche)
    * tâche représente la commande ou le script shell à exécuter
    * log représente le nom d'un fichier dans lequel stocker le journal des opérations. Si la clause > log n'est pas spécifiée, cron enverra automatiquement un courriel de confirmation. Pour éviter cela, il suffit de spécifier > /dev/null.

Pour chaque unité de temps (minute/heure/...) les notations sont possibles:

    * * : à chaque unité de temps (0, 1, 2, 3, 4...)
    * 5,8 : les unités de temps 5 et 8
    * 2-5 : les unités de temps de 2 à 5 (2, 3, 4, 5)
    * */3 : toutes les 3 unités de temps (0, 3, 6, 9...)
    * 10-20/3 : toutes les 3 unités de temps, entre la dixième et la vingtième (10, 13, 16, 19)
Imaginons que l'on veuille faire un journal (dans le fichier /tmp/log_df.txt par exemple) automatisé de l'espace disque libre (commande df) à des intervalles de temps précis :

  • Tous les jours à 23h30 :
 30 23 * * * df >>/tmp/log_df.txt
  • Toutes les heures, passées de 5 minutes :
 5 * * * * df >>/tmp/log_df.txt
  • Tous les premiers du mois à 23h30 :
 30 23 1 * * df >>/tmp/log_df.txt
  • Tous les lundis à 22h28 :
 28 22 * * 1 df >>/tmp/log_df.txt
  • Du 2 au 5 de chaque mois à 10h12 :
 12 10 2-5 * * df >>/tmp/log_df.txt
  • Tous les jours pairs du mois à 23h59 :
 59 23 */2 * * df >>/tmp/log_df.txt
  • Tous les jours à 22h que les jours ouvrés :
 0 22 * * 1-5 df >>/tmp/log_df.txt
  • Toutes les 5 minutes :
 */5 * * * * df >>/tmp/log_df.txt
  • Tous les derniers jours du mois (l'antislash devant % est obligatoire en édition de crontab, contrairement à l'exécution de la commande manuellement) :
 0 0 28-31 * * [ `/bin/date +\%d` -gt `/bin/date +\%d -d "1 day"` ] && df >>/tmp/log_df.txt
  • Tous les derniers dimanches du mois :
  • Première solution : comparer tous les dimanches avec celui de la semaine d'après.
 0 0 * * 0 [ `/bin/date +\%d` -gt `/bin/date +\%d -d "7 day"` ] && df >>/tmp/log_df.txt
  • Deuxième solution : tester la dernière semaine tous les mois.
 0 0 25-31 1,3,5,7,8,10,12 0 my-script.sh
 0 0 24-30 4,6,9,11 0 my-script.sh
 0 0 22-29 2 0 my-script.sh
  • Troisième solution : lancer un script avec le calendrier.
 0 0 21-31 * * /bin/script.sh
Autre exemple, le script shell suivant (que l'on supposera stocké dans /home/backup sous le nom backup.cmd) exporte les enregistrements de MySQL (de la table ccmusers par exemple) dans un fichier dont le nom est ccmusers suivi de la date sous la forme jour-mois-annee-heure-minute:

 #!/bin/sh
 DATE=$(date +%d-%m-%Y-%H-%M)
 /usr/local/mysql/bin/mysqldump -u root ccmusers > /home/backup/ccmusers${DATE}.sql

Ainsi pour automatiser (chaque jour à 23h59) le backup de la table ccmusers de MySQL et l'appel d'une page web (chaque jour à 21h30), il suffira d'ajouter l'entrée suivante dans la table cron:

 59 23 * * * /home/backup/backup.cmd >>/dev/null
 30 21 * * * wget -O /dev/null http://example.com/mapage.html >>/dev/null


   
   


Aucun commentaire:

Enregistrer un commentaire