L'ordonnancement des tâches consiste à exécuter automatiquement une tâche
(une application, une commande, ...) à intervalles de temps réguliers ou bien à
des moments précis. Généralement ce type de procédé est utilisé
pour automatiser des sauvegardes (on parle de backup), notamment à des heures où
le système est le moins sollicité (typiquement pendant la nuit pour les serveurs).
Les systèmes de type Unix (donc Linux) possèdent une application (plus exactement un démon) permettant de réaliser
ce type de service, il s'agit de cron.
Cron est basé sur une table référençant les tâches à lancer ainsi
que le mois, le jour, l'heure, la minute, la seconde à laquelle l'exécuter.
Cron est ainsi constitué:
- d'un démon: crond, c'est-à-dire un programme résident en mémoire
lançant automatiquement les tâches en fonction de la table cron
- d'une commande: crontab, permettant d'éditer la table des tâches
à ordonnancer
cron (en réalité crond) se trouve généralement dans le répertoire
/usr/sbin ou /sbin dans les distributions récentes. Pour connaître l'emplacement
de crond dans votre distribution linux, il vous suffit de taper la commande suivante:
whereis crond
La commande crontab édite en fait un fichier relatif à l'utilisateur
qui l'exécute. Ce fichier se situe dans:
/var/spool/cron/crontabs/utilisateur
Ainsi pour l'utilisateur root la table cron sera stockée dans:
/var/spool/cron/crontabs/root
Afin d'éditer la table cron, il suffit d'exécuter la commande suivante:
crontab -e
Cette commande a pour effet de lancer l'éditeur Vi présentant
la table actuelle (donc aucune si il s'agit du premier lancement de crontab).
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 jjj 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, ...)
- 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 mail de confirmation. Pour éviter cela il suffit de spécifier > /dev/null
Pour chaque unité de temps (minute/heure/...) les notations sont possibles:
- *: a chaque unité de temps
- 2-5: les unités de temps (2,3,4,5)
- */3: toutes les 3 unités de temps (0,3,6,...)
- 5,8: les unités de temps 5 et 8
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
- 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
Il est également possible d'exécuter automatiquement des commandes plus complexes
à l'aide d'un script shell. Il suffit donc dans un premier temps de créer un script.
Puis de le déclarer en tant que tâche dans la table cron.
Le script shell suivant (que l'on supposera stocke 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, il suffira d'ajouter l'entrée
suivante dans la table cron:
59 23 * * * /home/backup/backup.cmd >>/dev/null
Inspiré d'un article de Linux Magazine
|