Crontab, comment laisser votre pc bosser pour vous

Un petit billet pour aborder la gestion des taches plannifiées, avec l'outil Cron. Pour effectuer des sauvegardes automatiques, c'est l'outil idéal.

Prenons pour exemple le serveur Maikan, qui héberge quelques blogs. Il est nécessaire de faire une sauvegarde automatique des bases de données. Idéalement tous les jours d'ailleurs. C'est Apteno qui m'a permis de mettre en place ces sauvegardes grace à ce script.

  #!/bin/sh
  #
  ## on se place dans le repertoire ou l'on veut sauvegarder les bases
  #
  cd /mnt/backup1/sql/peupleloup
  
  for i in peupleloup_info pix phorum; do
  
  ## Sauvegarde des bases de donnees en fichiers .sql
  mysqldump -uroot -pxxxxxxxxxxxx $i > ${i}_`date +%D | sed 's;/;-;g'`.sql
  
  ## Compression des exports en tar.bz2 (le meilleur taux de compression)
  tar jcf ${i}_`date +%D | sed 's;/;-;g'`.sql.tar.bz2 ${i}_`date +%D | sed 's;/;-;g'`.sql
  
  ## Suppression des exports non compresses
  rm ${i}_`date +%D | sed 's;/;-;g'`.sql
  
  ## Suppression des sauvegardes vieilles de plus de 30 jours
  find . -type f -mtime +30 -exec rm -vf {} \\;
  
  
  done

Ce script permet de faire une sauvegarde de la base de données du Spip de Peupleloup, d'un outil d'upload d'images et du forum de mon association. Le fichier est suffisamment commenté pour comprendre comment il fonctionne. J'ai ajouté récemment la dernière partie permettant de supprimer les archives vieilles de plus de 30 jours (ça bouffe vite de la place).

Une fois rendu exécutable, ce script fait bien le travail et il suffit de le copier et de le modifier en fonction du nombre de sites qu'on a à gérer. Cependant, ça serait contre productif de lancer ce script manuellement, et impossible si on est pas devant l'écran. C'est là que Cron rentre en action.

Par souci de clarté, je place tous mes scripts dans un seul répertoire /root/.scripts/. Je vais faire un lien symbolique vers ce fichier dans le répertoire qui permettra à Cron de lancer celui-ci, c'est à dire dans /etc/cron.daily/ puisque je souhaite une sauvegarde quotidienne.

  ln -s /root/.scripts/backup-sql-peupleloup.sh /etc/cron.daily/backup-sql-peupleloup

Le problème est que je ne connais pas l'heure exacte où Cron va effectuer cette tache. En vérifiant le log de cron quelques jours après ( /var/log/cron ), je me rends compte que c'est en début d'après midi, ce qui ne m'arrange pas : c'est du boulot ce script et lorsqu'il est lancé, faut plus rien demandé au serveur ! Je préfère donc qu'il s'execute le matin.

Dans ce cas là, il est nécessaire d'éditer le crontab. Vous pouvez visualiser le crontab de l'utilisateur avec la commande crontab -l. Pour l'éditer : crontab -e

Dans mon cas, je vais commenter la ligne existante qui définit la fréquence journalière et rajouter une ligne qui fait la meme chose, mais à une heure précise.

  # If you don't want the output of a cron job mailed to you, you have to direct
  # any output to /dev/null.  We'll do this here since these jobs should run
  # properly on a newly installed system, but if they don't the average newbie
  # might get quite perplexed about getting strange mail every 5 minutes. ;-)
  #
  # Run the hourly, daily, weekly, and monthly cron jobs.
  # Jobs that need different timing may be entered into the crontab as before,
  # but most really don't need greater granularity than this.  If the exact
  # times of the hourly, daily, weekly, and monthly cron jobs do not suit your
  # needs, feel free to adjust them.
  #
  # Run hourly cron jobs at 47 minutes after the hour:
  @hourly  ID=sys-hourly  /usr/bin/run-parts /etc/cron.hourly 1> /dev/null
  #
  # Run daily cron jobs at 4:40 every day:
  #@daily   ID=sys-daily   /usr/bin/run-parts /etc/cron.daily 1> /dev/null
  #
  # Run weekly cron jobs at 4:30 on the first day of the week:
  @weekly  ID=sys-weekly  /usr/bin/run-parts /etc/cron.weekly 1> /dev/null
  #
  # Run monthly cron jobs at 4:20 on the first day of the month:
  @monthly ID=sys-monthly /usr/bin/run-parts /etc/cron.monthly 1> /dev/null
  
  # Run daily cron jobs at 3:30 every day:
  30 3 * * * /usr/bin/run-parts /etc/cron.daily 1> /dev/null

On voit que le commentaire au dessus du @daily est plutot mensonger ! Les chiffres au début de la dernière ligne (celle que j'ai ajoutée) correspondent à :

  • 30 : les minutes
  • 3 : les heures
  • les 3 * suivantes signifient tous les jours de tous les mois. (dans l'ordre : day of month(jour du mois) comprise entre 1 et 31, month(mois) comprise entre 1 et 12, day of week(jour de la semaine) comprise entre 0 et 7, le dimanche étant 0 ou 7, le lundi 1, etc ...

Cela signifie donc que tous les jours à 3h30, la commande /usr/bin/run-parts /etc/cron.daily sera lancée, et donc tous les scripts présents dans le répertoire/etc/cron.daily seront exécutés.

Voilà donc la fin de ce petit aide mémoire, qui me permettra de me remettre les idées au clair le jour où j'en aurais besoin. Voici également quelques liens utiles.

Bonne journée et joyeux Cron _o/

Vus : 220
Publié par botchchikii : 30