Chapitre 21. Automatiser les tâches système

Les tâches, aussi appelées jobs, peuvent être configurées pour être exécutées automatiquement dans un laps de temps spécifié, à une date spécifiée, ou lorsque la charge moyenne du système passe en-dessous de 0.8.
Red Hat Enterprise Linux est pré-configuré pour exécuter des tâches système importantes afin que le système reste à jour. Par exemple, la base de données slocate utilisée par la commande locate est mise à jour quotidiennement. Un administrateur systèmes peut utiliser des tâches automatisées pour effectuer des copies de sauvegarde périodiques, surveiller le système, exécuter des scripts personnalisés, et ainsi de suite.
Red Hat Enterprise Linux est fourni avec les utilitaires de tâches automatisées suivants : cron, anacron, at, et batch.
Chaque utilitaire est conçu pour planifier un type de tâche différent : tandis que Cron et Anacron planifient des tâches récurrentes, At et Batch planifient des tâches uniques (veuillez consulter Section 21.1, « Cron et Anacron » et Section 21.2, « « At » et « Batch » »).
Red Hat Enterprise Linux 7 prend en charge l'utilisation de systemd.timer pour exécuter une tâche à un moment spécifique. Veuillez consulter la page man systemd.timer(5) pour obtenir davantage d'informations.

21.1. Cron et Anacron

Cron et Anacron sont des démons pouvant planifier l'exécution de tâches récurrentes à un certain moment, défini par une heure exacte, un jour du mois, un jour de la semaine et par une semaine.
Les tâches Cron peuvent être exécutées chaque minute. Cependant, l'utilitaire suppose que le système soit en cours d'exécution de manière continuelle et si le système n'est pas exécuté lorsqu'une tâche est planifiée, la tâche ne sera pas exécutée.
D'autre part, Anacron se souvient des tâches planifiées si le système n'est pas en cours d'exécution au moment où la tâche est planifiée. La tâche est exécutée aussitôt que le système se trouve en cours d'exécution. Cependant, Anacron ne peut exécuter qu'une seule tâche par jour.

21.1.1. Installer Cron et Anacron

Pour installer Cron et Anacron, vous devrez installer le paquet cronie avec Cron et le paquet cronie-anacron avec Anacron (cronie-anacron est un sous-paquet de cronie).
Pour déterminer si les paquets sont déjà installés sur votre système, veuillez utiliser la commande suivante :
rpm -q cronie cronie-anacron
La commande retourne les noms complets des paquets cronie et cronie-anacron s'ils sont déjà installés ou vous notifie que les paquets ne sont pas disponibles.
Pour installer ces paquets, veuillez utiliser la commande yum sous le format suivant en tant qu'utilisateur root :
yum install package
Par exemple, pour installer Cron et Anacron, veuillez saisir ce qui suit dans une invite de shell :
~]# yum install cronie cronie-anacron
Pour obtenir davantage d'informations sur la manière d'installer de nouveaux paquets sur Red Hat Enterprise Linux, veuillez consulter la Section 8.2.4, « Installation de paquets ».

21.1.2. Exécuter le service Crond

Les tâches cron et anacron sont effectuées par le service crond. Cette section fournit des informations sur la manière de démarrer, arrêter, et de redémarrer le service crond, et montre comment le configurer afin qu'il soit lancé automatiquement lors du démarrage. Pour obtenir davantage d'informations sur la manière de gérer des services système sur Red Hat Enterprise Linux 7 en général, veuillez consulter le Chapitre 9, Gérer les services avec systemd.

21.1.2.1. Démarrer et arrêter le service Cron

Pour déterminer si le service est en cours d'exécution, veuillez utiliser la commande suivante :
systemctl status crond.service
Pour exécuter le service crond dans la session actuelle, veuillez saisir ce qui suit dans l'invite de shell en tant qu'utilisateur root :
systemctl start crond.service
Pour configurer le service de manière à ce qu'il soit lancé automatiquement lors du démarrage système, veuillez utiliser la commande suivante en tant qu'utilisateur root :
systemctl enable crond.service

21.1.2.2. Arrêter le service Cron

Pour arrêter le service crond dans sa session actuelle, veuillez saisir ce qui suit dans l'invite de shell en tant qu'utilisateur root :
systemctl stop crond.service
Pour empêcher le service d'être lancé automatiquement au démarrage, veuillez utiliser la commande suivante en tant qu'utilisateur root :
systemctl disable crond.service

21.1.2.3. Redémarrer le service Cron

Pour redémarrer le service crond, veuillez saisir ce qui suit dans une invite de shell en tant qu'utilisateur root :
systemctl restart crond.service
Cette commande arrête le service et le lance à nouveau en une succession rapide.

21.1.3. Configurer les tâches Anacron

Le fichier de configuration principal pour planifier les tâches est le fichier /etc/anacrontab, auquel seul l'utilisateur root peut accéder. Le fichier contient ce qui suit :
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days   delay in minutes   job-identifier   command
1         5     cron.daily    nice run-parts /etc/cron.daily
7         25    cron.weekly   nice run-parts /etc/cron.weekly
@monthly  45    cron.monthly  nice run-parts /etc/cron.monthly
Les trois premières lignes définissent les variables qui configurent l'environnement dans lequel les tâches Anacron sont exécutées :
  • SHELL — environnement shell utilisé pour exécuter des tâches (dans l'exemple, le shell Bash)
  • PATH — chemins d'accès des programmes exécutables
  • MAILTO — nom d'utilisateur de l'utilisateur destinataire de la sortie des tâches anacron par courrier électronique
    Si la variable MAILTO n'est pas définie (MAILTO=), alors le courrier électronique n'est pas envoyé.
Les deux variables suivantes modifient l'heure planifiée des tâches définies :
  • RANDOM_DELAY — nombre de minutes maximum pouvant être ajoutées à la variable delay in minutes (« délai en minutes »), qui est spécifiée pour chaque tâche
    La valeur de délai minimum est définie par défaut sur 6 minutes.
    Par exemple, si RANDOM_DELAY est défini sur 12, alors 6 à 12 minutes sont ajoutées à la variable delay in minutes pour chaque tâche dans cet anacrontab particulier. RANDOM_DELAY peut également être défini avec une valeur plus basse que 6, y compris 0. Si défini sur 0, aucun délai aléatoire n'est ajouté. Ceci se révèle utile lorsque, par exemple, davantage d'ordinateurs qui partagent une connexion réseau doivent téléverser les mêmes données chaque jour.
  • START_HOURS_RANGE — intervalle en heures définissant à quel moment les tâches planifiées peuvent être exécutées
    Dans le cas où l'intervalle est manqué, à cause d'une panne de l'alimentation par exemple, les tâches planifiées ne seront pas exécutées ce jour.
Les lignes restantes dans le fichier /etc/anacrontab représentent les tâches planifiées et suivent ce format :
period in days   delay in minutes   job-identifier   command
  • period in days — fréquence d'exécution des tâches, en jours
    La valeur de la propriété peut être définie en tant qu'entier ou macro (@daily, @weekly, @monthly), où @daily possède la même valeur qu'un entier de 1, @weekly possède la même que 7, et @monthly spécifie que la tâche est exécutée une fois par mois, quelle que soit la longueur du mois.
  • delay in minutes — nombre de minutes qu'Anacron attend avant d'exécuter la tâche
    La valeur de la propriété est définie en tant qu'entier. Si la valeur est définie sur 0, aucun délai ne s'appliquera.
  • job-identifier — nom unique faisant référence à une tâche particulière utilisée dans les fichiers journaux
  • command — commande devant être exécutée
    La commande peut être une commande telle que ls /proc >> /tmp/proc ou une commande qui exécute un script personnalisé.
Toute ligne commençant par le signe dièse (#) correspond à un commentaire et n'est pas traitée.

21.1.3.1. Exemples de tâches Anacron

L'exemple suivant montre un fichier /etc/anacrontab simple :
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=30
# the jobs will be started during the following hours only
START_HOURS_RANGE=16-20

#period in days   delay in minutes   job-identifier   command
1         20    dailyjob      nice run-parts /etc/cron.daily
7         25    weeklyjob     /etc/weeklyjob.bash
@monthly  45    monthlyjob    ls /proc >> /tmp/proc
Toutes les tâches définies dans ce fichier anacrontab sont retardées de 6 à 30 minutes et peuvent être exécutées entre 16h00 et 20h00.
La première tâche définie est déclenchée quotidiennement entre 16h26 et 16h50 (RANDOM_DELAY se trouve entre 6 et 30 minutes ; la propriété delay in minutes ajoute 20 minutes). La commande spécifiée pour cette tâche exécute tous les programmes présents dans le répertoire /etc/cron.daily/ à l'aide du script run-parts (les scripts run-parts acceptent un répertoire en tant qu'argument de ligne de commande et exécutent séquentiellement tous les programmes dans le répertoire). Veuillez consulter la page man run-parts pour obtenir davantage d'informations sur le script run-parts.
La seconde tâche exécute le script weeklyjob.bash dans le répertoire /etc une fois par semaine.
La troisième tâche exécute une commande, qui écrit le contenu de /proc sur le fichier /tmp/proc (ls /proc >> /tmp/proc) une fois par mois.

21.1.4. Configuration des tâches Cron

Le fichier de configuration pour les tâches cron est /etc/crontab, et peut uniquement être modifié par l'utilitasteur root. Le fichier contient ce qui suit :
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
Les trois premières lignes contiennent les mêmes définitions de variables qu'un fichier anacrontab : SHELL, PATH, et MAILTO. Pour obtenit davantage d'informations sur ces variables, veuillez consulter la Section 21.1.3, « Configurer les tâches Anacron ».
En outre, le fichier peut définir la variable HOME. La variable HOME définit le répertoire, qui sera utilisé comme répertoire personnel lorsque des commandes ou scripts seront exécutés par la tâche.
Les lignes restantes dans le fichier /etc/crontab représentent les tâches planifiées et se trouvent sous le format suivant :
minute   hour   day   month   day of week   username   command
Ce qui suit permet de définir le moment auquel la tâche doit être exécutée :
  • minute — un entier de 0 à 59
  • hour — un entier de 0 à 23
  • day — un entier de 1 à 31 (doit être un jour valide si le mois est spécifié)
  • month — un entier de 1 à 12 (ou l'abbrévation du nom en anglais, par exemple « jan » ou « feb »)
  • day of week — un entier de 0 à 7, où soit 0, soit 7, correspond au dimanche (ou l'abbréviation du nom en anglais du jour de la semaine, par exemple « sun » ou « mon »)
Ce qui suit permet de définir les autres propriétés des tâches :
  • username — indique l'utilisateur sous lequel les tâches doivent être exécutées.
  • command — la commande devant être exécutée.
    La commande peut être une commande telle que ls /proc /tmp/proc, ou une commande qui exécute un script personnalisé.
Pour toutes les valeurs ci-dessus, un astérisque (« * ») peut être utilisé pour indiquer toutes les valeurs valides. Par exemple, si vous définissez la valeur du mois avec un astérisque, la tâche sera exécutée chaque mois selon les autres valeurs.
Un tiret (« - ») entre nombres entiers indique une plage d'entiers. Par exemple, 1-4 signifie les entiers 1, 2, 3, et 4.
Des valeurs séparées par des virgules (« , ») indiquent une liste. Par exemple, 3,4,6,8 indique exactement ces quatre entiers.
La barre oblique (« / ») peut être utilisée pour spécifier des valeurs étapes. La valeur d'un entier sera ignorée à l'intérieur d'une plage suivant la plage avec les /entier. Par exemple, la valeur minute définie par 0-59/2 indique chaque seconde minute du champ minute. Des valeurs étapes peuvent également être utilisées avec un astérisque. Par exemple, si la valeur du mois est définie par */3, la tâche sera exécutée tous les trois mois.
Toute ligne commençant par le signe dièse (#) correspond à un commentaire et n'est pas traitée.
Les utilisateurs autres que l'utilisateur root peuvent configurer les tâches Cron avec l'utilitaire crontab. Les crontabs définis utilisateur sont stockés dans le répertoire /var/spool/cron/ et exécutés comme s'ils étaient exécutés par les utilisateurs qui les ont créés.
Pour créer un crontab en tant qu'utilisateur spécifique, connectez-vous avec ce nom d'utilisateur et saisissez la commande crontab -e pour modifier le crontab de l'utilisateur avec l'éditeur spécifié dans la variable d'environnement VISUAL ou EDITOR. Le fichier utilise le même format que /etc/crontab. Lorsque les changements crontab sont enregistrés, le crontab est stocké selon le nom d'utilisateur, puis écrit sur le fichier /var/spool/cron/username. Pour répertorier le contenu du fichier crontab de l'utilisateur, veuillez utiliser la commande crontab -l.
Le répertoire /etc/cron.d/ contient des fichiers qui possèdent la même syntaxe que le fichier /etc/crontab. Seul l'utilisateur root est autorisé à créer et à modifier des fichiers dans ce répertoire.

Note

Le démon cron vérifie si des modifications se produisent dans le fichier /etc/anacrontab, le fichier /etc/crontab, le répertoire /etc/cron.d/, et le répertoire /var/spool/cron/ chaque minute et tout changement détecté est chargé en mémoire. Ainsi, il n'est pas utile de redémarrer le démon après le changement d'un fichier anacrontab ou crontab.

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

Pour limiter l'accès à Cron, vous pouvez utiliser les fichiers /etc/cron.allow et /etc/cron.deny. Ces fichiers de contrôle d'accès utilisent le même format avec un nom d'utilisateur sur chaque ligne. N'oubliez pas que les caractères d'espace ne sont pas autorisés dans ces fichiers.
Si le fichier cron.allow existe, seuls les utilisateurs répertoriés dans celui-ci seront autorisés à utiliser cron, et le fichier cron.deny sera ignoré.
Si le fichier cron.allow n'existe pas, les utilisateurs répertoriés dans le fichier cron.deny ne seront pas autorisés à utiliser Cron.
Le démon Cron (crond) n'a pas besoin d'être redémarré si les fichiers de contrôle d'accès sont modifiés. Les fichiers de contrôle d'accès sont vérifiés chaque fois qu'un utilisateur tente d'ajouter ou de supprimer une tâche Cron.
L'utilisateur root peut toujours utiliser Cron, peu importe les noms d'utilisateurs répertoriés dans les fichiers de contrôle d'accès.
Vous pouvez contrôler les accès via les modules PAM (« Pluggable Authentication Modules »). Les paramètres sont stockés dans le fichier /etc/security/access.conf. Par exemple, après avoir ajouté la ligne suivante au fichier, aucun utilisateur autre que l'utilisateur root ne pourra créer de Crontabs :
-:ALL EXCEPT root :cron
Les tâches interdites sont journalisées dans un fichier journal approprié ou, lorsque la commande crontab -e est utilisée, retournées vers la sortie standard. Pour obtenir davantage d'informations, veuillez consulter la page du manuel access.conf.5.

21.1.6. Mettre des tâches Cron sur liste noire et sur liste blanche

La mise sur liste noire et sur liste blanche des tâches est utilisée pour définir les parties d'une tâche qui n'ont pas besoin d'être exécutées. Ceci est utile lors de l'appel d'un script run-parts sur un répertoire Cron, tel que /etc/cron.daily/ : si l'utilisateur ajoute des programmes se trouvant dans le répertoire à la liste noire des tâches, le script run-parts n'exécutera pas ces programmes.
Pour définir une liste noire, veuillez créer un fichier jobs.deny dans le répertoire à partir duquel les scripts run-parts sont exécutés. Par exemple, si vous devez éviter un programme particulier dans /etc/cron.daily/, veuillez créer le fichier /etc/cron.daily/jobs.deny. Dans ce fichier, spécifiez les noms des programmes à supprimer de l'exécution (seuls les programmes se trouvant dans le même répertoire peuvent être inscrits). Si une tâche exécute une commande qui exécute les programmes du répertoire /etc/cron.daily/, comme run-parts /etc/cron.daily, les programmes définis dans le fichier jobs.deny ne seront pas exécutés.
Pour définir une liste blanche, veuillez créer un fichier jobs.allow.
Les principes de jobs.deny et jobs.allow sont les mêmes que ceux de cron.deny et cron.allow, ils sont décrits dans la section Section 21.1.5, « Contrôle de l'accès à cron ».