Chapitre 37. Tâches automatisées

Dans Linux, des tâches peuvent être configurées pour être exécutées automatiquement pendant une période de temps ou à une date donnée, ou encore, lorsque la moyenne de chargement du système se situe en dessous d'un certain niveau. Red Hat Enterprise Linux est préconfiguré pour l'exécution de certaines tâches système importantes permettant de garder votre système à jour. Par exemple, la base de données slocate utilisée par la commande locate est mise à jour quotidiennement. Un administrateur système peut utiliser des tâches automatisées pour effectuer entre autres des sauvegardes périodiques, contrôler le système, exécuter des scripts personnalisés.

Red Hat Enterprise Linux est livré avec plusieurs utilitaires de tâches automatisées : cron, at et batch.

37.1. Cron

Cron est un démon qui peut être utilisé pour programmer l'exécution de tâches récurrentes en fonction d'une combinaison de l'heure, du jour du mois, du mois, du jour de la semaine et de la semaine.

Cron suppose que le système est allumé en permanence. Si le système n'est pas allumé au moment où une tâche doit être exécutée, l'exécution n'a pas lieu. Pour configurer des tâches qui ne seront exécutées qu'une seule fois, reportez-vous à la Section 37.2.

Afin de pouvoir utiliser le service cron, le paquetage RPM vixie-cron doit être installé et le service crond doit être en cours d'exécution. Pour savoir si le paquetage est installé, utilisez la commande rpm -q vixie-cron. Pour savoir si le service est en cours d'exécution, utilisez la commande /sbin/service crond status.

37.1.1. Configuration des tâches Cron

Le fichier de configuration principal de cron, /etc/crontab, contient les lignes suivantes :

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

Les quatre premières lignes représentent des variables servant à configurer l'environnement dans lequel les tâches cron sont exécutées. La valeur de la variable SHELL indique au système quel environnement shell utiliser (le shell bash dans cet exemple) et la variable PATH définit le chemin d'accès utilisé pour l'exécution des commandes. Le résultat des tâches cron est envoyé par courrier électronique au nom d'utilisateur défini par la variable MAILTO. Si la variable MAILTO est définie comme étant une chaîne vide (MAILTO=""), aucun courrier électronique n'est envoyé. La variable HOME peut être utilisée pour définir le répertoire personnel à utiliser lors de l'exécution de commandes ou de scripts.

Chacune des lignes du fichier /etc/crontab représente une tâche et se présente sous le format suivant :

minute   hour   day   month   dayofweek   command

  • minute — tout nombre entier compris entre 0 et 59

  • hour — tout nombre entier compris entre 0 et 23, pour l'heure

  • day — tout nombre entier compris entre 1 et 31 pour le jour (si le mois est spécifié, le jour doit être valide)

  • month — tout nombre entier compris entre 1 et 12 pour le mois (ou abréviation du nom du mois comme jan pour janvier, feb pour février, etc.)

  • dayofweek — tout nombre entier compris entre 0 et 7 pour le jour de la semaine, 0 ou 7 représentant le dimanche (ou l'abréviation du jour de la semaine comme sun pour dimanche ou mon pour lundi)

  • command — la commande à exécuter (il peut s'agir d'une commande telle que ls /proc >> /tmp/proc ou de la commande d'exécution d'un script personnalisé)

Pour toute valeur ci-dessus, un astérisque (*) peut être utilisé afin d'indiquer toutes les valeurs valides. Par exemple, un astérisque utilisé pour la valeur du mois signifie une exécution mensuelle de la commande, en tenant compte bien sûr des contraintes liées aux autres valeurs.

Un trait d'union (-) placé entre deux nombres entiers indique une fourchette de nombres entiers. Par exemple, 1-4 correspond aux nombres entiers 1, 2, 3 et 4.

Une série de valeurs séparées par des virgules (,) détermine une liste. Par exemple, 3, 4, 6, 8 correspond à ces quatre nombres entiers spécifiques.

La barre oblique en avant (/) peut être utilisée pour spécifier des valeurs échelonnées. Pour sauter la valeur d'un nombre entier dans une fourchette, faites suivre la fourchette de /<nombre entier>. Par exemple, 0-59/2 permet de définir une minute sur deux dans le champ des minutes. Ces valeurs échelonnées peuvent également être utilisées avec un astérisque. Par exemple, la valeur */3 peut être utilisée dans le champ des mois pour exécuter la tâche tous les trois mois.

Toute ligne commençant par le signe dièse (#) correspond à un commentaire et n'est pas traitée.

Comme le montre le fichier /etc/crontab, le script run-parts est utilisé pour exécuter les scripts des répertoires /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly et /etc/cron.monthly sur une base respectivement horaire, quotidienne, hebdomadaire ou mensuelle. Les fichiers de ces répertoires doivent être des scripts shell.

Si une tâche cron doit être exécutée sur une base qui n'est ni horaire, ni quotidienne, ni hebdomadaire, ni mensuelle, elle peut être ajoutée au répertoire /etc/cron.d. Tous les fichiers de ce répertoire utilisent la même syntaxe que /etc/crontab. Reportez-vous à l'Exemple 37-1 pour obtenir différents exemples.

# record the memory usage of the system every monday 
# at 3:30AM in the file /tmp/meminfo
30 3 * * mon cat /proc/meminfo >> /tmp/meminfo
# run custom script the first day of every month at 4:10AM
10 4 1 * * /root/scripts/backup.sh

Exemple 37-1. Exemples de crontab

Les utilisateurs autres que le super-utilisateur (root) peuvent configurer des tâches cron à l'aide de l'utilitaire crontab. Tous les crontabs définis par l'utilisateur sont stockés dans le répertoire /var/spool/cron et exécutés en utilisant les noms des utilisateurs qui les ont créés. Pour créer un crontab en tant qu'un utilisateur, connectez-vous sous le nom de cet utilisateur et tapez la commande crontab -e afin de modifier le crontab de l'utilisateur à l'aide de l'éditeur déterminé par la variable d'environnement VISUAL ou EDITOR. Le fichier utilise le même format que /etc/crontab. Lorsque les modifications apportées à crontab sont enregistrées, crontab est stocké en fonction du nom d'utilisateur et est enregistré dans le fichier /var/spool/cron/nom-utilisateur.

Le démon cron vérifie le fichier /etc/crontab, le répertoire /etc/cron.d/ ainsi que le répertoire /var/spool/cron toutes les minutes afin de voir si des modifications ont été apportées. S'il en trouve, celles-ci sont chargées dans la mémoire. Il n'est par conséquent pas nécessaire de redémarrer le démon si un fichier crontab est modifié.

37.1.2. Contrôle de l'accès à cron

Les fichiers /etc/cron.allow et /etc/cron.deny sont utilisés pour limiter l'accès à cron. Le format de ces deux fichiers de contrôle d'accès requiert la présence d'un nom d'utilisateur sur chaque ligne. Les espaces blancs ne sont pas acceptés. Le démon cron (crond) n'a pas à être redémarré si les fichiers de contrôle d'accès sont modifiés. Ces derniers sont lus chaque fois qu'un utilisateur essaie d'ajouter ou de supprimer une tâche cron.

Le super-utilisateur (root) est toujours en mesure d'utiliser cron, indépendamment des noms d'utilisateurs répertoriés dans les fichiers de contrôle d'accès.

Si le fichier cron.allow existe, seuls les utilisateurs qui y sont répertoriés peuvent utiliser cron et le fichier cron.deny n'est pas pris en compte.

En revanche, si le fichier cron.allow n'existe pas, les utilisateurs répertoriés dans cron.deny ne sont pas autorisés à utiliser cron.

37.1.3. Démarrage et arrêt du service

Pour lancer le service cron, utilisez la commande /sbin/service crond start. Pour interrompre le service, utilisez la commande /sbin/service crond stop. Il est recommandé de lancer le service au démarrage. Reportez-vous au Chapitre 21 pour en savoir plus sur le lancement automatique du service cron au démarrage.