107.2 Leçon 1
Certification : |
LPIC-1 |
---|---|
Version : |
5.0 |
Thème : |
107 Tâches administratives |
Objectif : |
107.2 Automatisation des tâches d’administration par la planification des travaux |
Leçon : |
1 sur 2 |
Introduction
Une des missions les plus essentielles d’un administrateur système digne de ce nom consiste à organiser les tâches qui doivent être exécutées de manière régulière. À titre d’exemple, un administrateur peut créer et automatiser des tâches pour les sauvegardes et les mises à jour du système et pour effectuer toutes sortes d’autres activités répétitives. Pour ce faire, vous pouvez utiliser la fonction cron
, qui permet d’automatiser la planification des tâches périodiques.
Planifier des tâches avec Cron
Sous Linux, cron
est un démon qui fonctionne en continu et qui se réveille toutes les minutes pour interroger un ensemble de tables dans le but d’y trouver des tâches à exécuter. Ces tables sont connues sous le nom de crontabs et contiennent ce que l’on appelle les cron jobs. Cron convient aux serveurs et aux systèmes qui sont constamment allumés dans la mesure où chaque tâche cron n’est exécutée que si le système fonctionne à l’heure prévue. Il peut être utilisé par des utilisateurs lambda qui disposent chacun de leur propre crontab
ainsi que par l’utilisateur root qui gère les crontabs du système.
Note
|
Sous Linux, il existe également l’outil |
Crontabs utilisateur
Les crontabs utilisateur sont des fichiers texte qui gèrent l’ordonnancement des tâches cron définies par les utilisateurs. Ils sont toujours nommés en fonction du compte utilisateur qui les a créés, mais l’emplacement exact de ces fichiers dépend de la distribution utilisée (généralement un sous-répertoire de /var/spool/cron
).
Chaque ligne d’une crontab utilisateur contient six champs séparés par un espace :
-
La minute de l’heure (0-59).
-
L’heure du jour (0-23).
-
Le jour du mois (1-31).
-
Le mois de l’année (1-12).
-
Le jour de la semaine (0-7 avec dimanche=0 ou dimanche=7).
-
La commande à exécuter.
Pour le mois de l’année et le jour de la semaine, vous pouvez utiliser les trois premières lettres du nom au lieu du chiffre correspondant.
Les cinq premiers champs indiquent à quel moment il faut exécuter la commande spécifiée dans le sixième champ. Ils peuvent contenir une ou plusieurs valeurs. En particulier, vous pouvez spécifier plusieurs valeurs en utilisant :
*
(astérisque)-
Désigne toute valeur.
,
(virgule)-
Désigne une liste de valeurs possibles.
-
(tiret)-
Désigne une fourchette de valeurs possibles.
/
(barre oblique)-
Désigne des valeurs par paliers.
La plupart des distributions fournissent le fichier /etc/crontab
qui peut être utilisé comme référence pour la syntaxe d’un fichier cron
. Voici un exemple de fichier /etc/crontab
d’une installation Debian :
SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # 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
Crontabs système
Les crontabs système sont des fichiers texte qui gèrent l’ordonnancement des tâches cron du système et qui ne peuvent être édités que par l’utilisateur root. /etc/crontab
et tous les fichiers du répertoire /etc/cron.d
sont des crontabs système.
La plupart des distributions fournissent également les répertoires /etc/cron.hourly
, /etc/cron.daily
, /etc/cron.weekly
et /etc/cron.monthly
qui contiennent les scripts à exécuter à la fréquence correspondante. Par exemple, si vous voulez exécuter un script une fois par jour, vous pouvez le placer dans /etc/cron.daily
.
Warning
|
Certaines distributions utilisent |
La syntaxe des crontabs système ressemble à celle des crontabs utilisateur, avec en plus un champ obligatoire qui définit l’utilisateur censé exécuter la tâche cron. Par conséquent, chaque ligne d’une crontab système contient sept champs séparés par un espace :
-
La minute de l’heure (0-59).
-
L’heure du jour (0-23).
-
Le jour du mois (1-31).
-
Le mois de l’année (1-12).
-
Le jour de la semaine (0-7 avec dimanche=0 ou dimanche=7).
-
Le nom du compte utilisateur censé exécuter la commande.
-
La commande à exécuter.
Comme pour les crontabs utilisateurs, vous pouvez spécifier plusieurs valeurs pour les champs horaires en utilisant les opérateurs *
, ,
, -
et /
. Vous pouvez également indiquer le mois de l’année et le jour de la semaine en utilisant les trois premières lettres du nom au lieu du nombre correspondant.
Spécifications horaires particulières
Lorsque vous éditez des fichiers crontab, vous pouvez également utiliser une série de raccourcis spécifiques dans les cinq premières colonnes en remplacement des spécifications horaires :
@reboot
-
Exécute la tâche spécifiée une fois après un redémarrage.
@hourly
-
Exécute la tâche spécifiée une fois par heure au début de l’heure.
@daily
(ou@midnight
)-
Exécute la tâche spécifiée une fois par jour à minuit.
@weekly
-
Exécute la tâche spécifiée une fois par semaine, le dimanche à minuit.
@monthly
-
Exécute la tâche spécifiée une fois par mois à minuit le premier jour du mois.
@yearly
(ou@annually
)-
Exécute la tâche spécifiée une fois par an, le 1er janvier à minuit.
Variables Crontab
Dans un fichier crontab, il peut y avoir des affectations de variables en amont de la planification des tâches. Voici les variables d’environnement couramment définies :
HOME
-
Le répertoire où
cron
invoque les commandes (par défaut le répertoire personnel de l’utilisateur). MAILTO
-
Le nom de l’utilisateur ou l’adresse à laquelle la sortie standard et les messages d’erreur sont envoyés (par défaut, le propriétaire de la crontab). Plusieurs valeurs séparées par des virgules sont également autorisées et une valeur vide indique qu’aucun e-mail ne doit être envoyé.
PATH
-
Le chemin où les commandes pourront être trouvées.
SHELL
-
Le shell à utiliser (par défaut
/bin/sh
).
Créer des tâches Cron utilisateurs
La commande crontab
est utilisée pour maintenir les fichiers crontab pour les utilisateurs individuels. Plus concrètement, vous pouvez lancer la commande crontab -e
pour éditer votre propre fichier crontab ou pour en créer un s’il n’existe pas encore.
$ crontab -e no crontab for frank - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano < ‑‑‑‑ easiest 3. /usr/bin/emacs24 4. /usr/bin/vim.tiny Choose 1-4 [2]:
Par défaut, la commande crontab
lance l’éditeur spécifié par les variables d’environnement VISUAL
ou EDITOR
pour vous permettre d’éditer votre fichier crontab avec votre éditeur préféré. Certaines distributions, comme le montre l’exemple ci-dessus, vous permettent de sélectionner l’éditeur à partir d’une liste lors de la première exécution de crontab
.
Si vous voulez exécuter le script foo.sh
dans votre répertoire personnel tous les jours à 10:00, vous pouvez ajouter la ligne suivante à votre fichier crontab :
0 10 * * * /home/frank/foo.sh
Jetez un œil sur ces exemples de crontabs :
0,15,30,45 08 * * 2 /home/frank/bar.sh 30 20 1-15 1,6 1-5 /home/frank/foobar.sh
Dans la première ligne, le script bar.sh
est exécuté tous les mardis à 08h00, à 08h15, à 08h30 et à 08h45. À la deuxième ligne, le script foobar.sh
est exécuté à 20h30 du lundi au vendredi pendant les quinze premiers jours de janvier et de juin.
Warning
|
Même si les fichiers crontab peuvent être édités manuellement, il vaut mieux utiliser la commande |
En dehors de l’option -e
mentionnée ci-dessus, la commande crontab
comporte d’autres options utiles :
-l
-
Affiche la crontab actuelle sur la sortie standard.
-r
-
Supprime la crontab actuelle.
-u
-
Spécifie le nom de l’utilisateur dont la crontab doit être modifiée. Cette option requiert les privilèges de l’utilisateur root et lui permet de modifier les fichiers crontab des utilisateurs.
Créer des tâches Cron système
Contrairement aux crontabs utilisateurs, les crontabs système sont mises à jour avec un éditeur : ce n’est donc pas la peine de lancer la commande crontab
pour éditer /etc/crontab
et les fichiers dans /etc/cron.d
. Notez que lorsque vous éditez des crontabs système, vous devez indiquer le compte qui sera utilisé pour exécuter la tâche cron (généralement l’utilisateur root).
Par exemple, si vous voulez exécuter le script barfoo.sh
situé dans le répertoire /root
tous les jours à 01:30 du matin, vous pouvez ouvrir /etc/crontab
avec votre éditeur préféré et ajouter la ligne suivante :
30 01 * * * root /root/barfoo.sh >>/root/output.log 2>>/root/error.log
Dans l’exemple ci-dessus, la sortie de la tâche est ajoutée à /root/output.log
, tandis que les erreurs s’ajoutent à /root/error.log
.
Warning
|
À moins que la sortie ne soit redirigée vers un fichier comme dans l’exemple ci-dessus (ou que la variable |
Configurer l’accès à la planification des tâches
Sous Linux, les fichiers /etc/cron.allow
et /etc/cron.deny
sont utilisés pour définir les restrictions de crontab
. Plus précisément, on les utilise pour autoriser ou interdire la planification de tâches cron pour différents utilisateurs. Si /etc/cron.allow
existe, seuls les utilisateurs non root répertoriés dans ce fichier ont le droit de planifier des tâches cron en utilisant la commande crontab
. Si /etc/cron.allow
n’existe pas mais que /etc/cron.deny
existe, les utilisateurs non root listés dans ce fichier ne peuvent pas planifier de tâches cron en utilisant la commande crontab
(dans ce cas, un /etc/cron.deny
vide signifie que chaque utilisateur est autorisé à planifier des tâches cron avec crontab
). Si aucun de ces fichiers n’existe, l’accès des utilisateurs à la planification des tâches cron dépend de la distribution utilisée.
Note
|
Les fichiers |
Une alternative à Cron
Si vous gérez le système et les services avec systemd, vous pouvez utiliser les timers comme alternative à cron
pour planifier vos tâches. Les timers sont des fichiers d’unité systemd identifiés par le suffixe .timer
, et pour chacun d’entre eux, il doit y avoir un fichier unité correspondant qui décrit l’unité à activer lorsque le timer est écoulé. Par défaut, un timer
active un service portant le même nom, au suffixe près.
Un timer comprend une section [Timer]
qui spécifie l’heure à laquelle les tâches planifiées doivent être exécutées. Plus précisément, vous pouvez utiliser l’option OnCalendar=
pour définir des timers temps réel qui fonctionnent de la même manière que les tâches cron (ils sont basés sur des expressions d’événements calendaires). L’option OnCalendar=
requiert la syntaxe suivante :
DayOfWeek Year-Month-Day Hour:Minute:Second
avec DayOfWeek
qui est optionnel. Les opérateurs *
, /
et ,
ont la même signification que ceux utilisés pour les tâches cron, et vous pouvez utiliser ..
entre deux valeurs pour indiquer une plage contiguë. Pour la spécification de DayOfWeek
, vous pouvez utiliser les trois premières lettres du nom ou le nom complet.
Note
|
Vous pouvez également définir des timers monotoniques qui s’activent après un certain temps écoulé à partir d’un point de départ donné (par exemple, lorsque la machine a été démarrée ou lorsque le timer lui-même a été activé). |
Par exemple, si vous voulez lancer le service /etc/systemd/system/foobar.service
à 05:30 le premier lundi de chaque mois, vous pouvez ajouter les lignes suivantes dans le fichier d’unité /etc/systemd/system/foobar.timer
correspondant.
[Unit] Description=Run the foobar service [Timer] OnCalendar=Mon *-*-1..7 05:30:00 Persistent=true [Install] WantedBy=timers.target
Une fois que vous avez créé le nouveau timer, vous pouvez l’activer et le démarrer en exécutant les commandes suivantes en tant que root :
# systemctl enable foobar.timer # systemctl start foobar.timer
Vous pouvez modifier la fréquence de votre tâche planifiée en éditant la valeur OnCalendar
puis en invoquant la commande systemctl daemon-reload
.
Enfin, si vous voulez voir la liste des timers actifs triés par ordre chronologique, vous pouvez utiliser la commande systemctl list-timers
. Vous pouvez ajouter l’option --all
pour afficher également les unités de timers inactives.
Note
|
Rappelez-vous que les timers sont enregistrés dans le journal de systemd et que vous pouvez consulter les journaux des différentes unités en utilisant la commande |
En remplacement de la forme normalisée longue décrite ci-dessus, vous pouvez utiliser des expressions spécifiques qui décrivent les fréquences particulières de l’exécution des tâches :
hourly
-
Exécuter la tâche spécifiée une fois par heure au début de l’heure.
daily
-
Exécuter la tâche spécifiée une fois par jour à minuit.
weekly
-
Exécuter la tâche spécifiée une fois par semaine, le lundi à minuit.
monthly
-
Exécuter la tâche spécifiée une fois par mois à minuit le premier jour du mois.
yearly
-
Exécuter la tâche spécifiée une fois par an à minuit le 1er janvier.
Vous pouvez consulter les pages du manuel systemd.timer(5)
pour la liste complète des spécifications de la date et de l’heure.
Exercices guidés
-
Pour chacun des raccourcis
crontab
suivants, indiquez la spécification de temps correspondante (les cinq premières colonnes d’un fichiercrontab
) :@hourly
@daily
@weekly
@monthly
@annually
-
Pour chacun des raccourcis
OnCalendar
suivants, indiquez la spécification temporelle correspondante (la forme normalisée longue) :hourly
daily
weekly
monthly
yearly
-
Expliquez la signification des spécifications temporelles suivantes pour un fichier
crontab
:30 13 * * 1-5
00 09-18 * * *
30 08 1 1 *
0,20,40 11 * * Sun
00 09 10-20 1-3 *
*/20 * * * *
-
Expliquez la signification des spécifications temporelles suivantes utilisées dans l’option
OnCalendar
d’un fichier timer :*-*-* 08:30:00
Sat,Sun *-*-* 05:00:00
*-*-01 13:15,30,45:00
Fri *-09..12-* 16:20:00
Mon,Tue *-*-1,15 08:30:00
*-*-* *:00/05:00
Exercices d’approfondissement
-
En partant du principe que vous êtes autorisé à planifier des tâches avec
cron
en tant qu’utilisateur ordinaire, quelle commande utiliseriez-vous pour créer votre propre fichier crontab ? -
Créez une tâche planifiée simple qui exécute la commande
date
tous les vendredi à 01:00 de l’après-midi. Où pouvez-vous voir le résultat de cette tâche ? -
Créez une autre tâche planifiée qui exécute le script
foobar.sh
toutes les minutes, en redirigeant la sortie vers le fichieroutput.log
dans votre répertoire personnel de façon à ce que seule l’erreur standard vous soit envoyée par e-mail. -
Jetez un œil à l’entrée
crontab
de la tâche planifiée nouvellement créée. Pourquoi ne pas préciser le chemin absolu du fichier dans lequel la sortie standard est sauvegardée ? Et pourquoi utiliser la commande./foobar.sh
pour exécuter le script ? -
Éditez l’entrée
crontab
précédente en supprimant la redirection de sortie et désactivez la première tâche cron que vous avez créée. -
Comment faire pour envoyer le résultat ainsi que les erreurs de votre tâche planifiée au compte utilisateur
emma
par e-mail ? Et comment éviter d’envoyer la sortie standard et les erreurs par e-mail ? -
Exécutez la commande
ls -l /usr/bin/crontab
. Quelle permission spéciale est activée et quelle est sa signification ?
Résumé
Voici ce que nous avons appris dans cette leçon :
-
Utiliser
cron
pour exécuter des tâches à des intervalles réguliers. -
Gérer les tâches cron.
-
Configurer l’accès utilisateur à la planification des tâches cron.
-
Comprendre le rôle des unités timer de systemd en tant qu’alternative à
cron
.
Voici les commandes et les fichiers que nous avons abordés dans cette leçon :
crontab
-
Gérer les fichiers
crontab
pour les utilisateurs particuliers. /etc/cron.allow
et/etc/cron.deny
-
Fichiers permettant de définir les restrictions de
crontab
. /etc/crontab
-
Fichier crontab du système.
/etc/cron.d
-
Le répertoire qui contient les fichiers crontab du système.
systemctl
-
Contrôle le gestionnaire de système et de services systemd. En relation avec les timers, la commande peut être utilisée pour les activer et les démarrer.
Réponses aux exercices guidés
-
Pour chacun des raccourcis
crontab
suivants, indiquez la spécification de temps correspondante (les cinq premières colonnes d’un fichiercrontab
) :@hourly
0 * * * *
@daily
0 0 * * *
@weekly
0 0 * * 0
@monthly
0 0 1 * *
@annually
0 0 1 1 *
-
Pour chacun des raccourcis
OnCalendar
suivants, indiquez la spécification temporelle correspondante (la forme normalisée longue) :hourly
*-*-* *:00:00
daily
*-*-* 00:00:00
weekly
Mon *-*-* 00:00:00
monthly
*-*-01 00:00:00
yearly
*-01-01 00:00:00
-
Expliquez la signification des spécifications temporelles suivantes pour un fichier
crontab
:30 13 * * 1-5
À 13h30 tous les jours de la semaine du lundi au vendredi
00 09-18 * * *
Tous les jours et toutes les heures de 09h00 à 18h00
30 08 1 1 *
Le premier jour du mois de janvier à 8h30
0,20,40 11 * * Sun
Chaque dimanche à 11h00, 11h20 et 11h40
00 09 10-20 1-3 *
À 09h00 du 10 au 20 janvier, février et mars
*/20 * * * *
Toutes les vingt minutes
-
Expliquez la signification des spécifications temporelles suivantes utilisées dans l’option
OnCalendar
d’un fichier timer :*-*-* 08:30:00
Tous les jours à 08h30
Sat,Sun *-*-* 05:00:00
À 05h00 le samedi et le dimanche
*-*-01 13:15,30,45:00
À 13 h 15, 13 h 30 et 13 h 45 le premier jour du mois
Fri *-09..12-* 16:20:00
À 16 h 20 tous les vendredi des mois de septembre, octobre, novembre et décembre
Mon,Tue *-*-1,15 08:30:00
Le premier ou le quinzième jour de chaque mois, à 8h30, uniquement si ce jour est un lundi ou un mardi.
*-*-* *:00/05:00
Toutes les cinq minutes
Réponses aux exercices d’approfondissement
-
En partant du principe que vous êtes autorisé à planifier des tâches avec
cron
en tant qu’utilisateur ordinaire, quelle commande utiliseriez-vous pour créer votre propre fichier crontab ?dave@hostname ~ $ crontab -e no crontab for dave - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano < ---- easiest 3. /usr/bin/emacs24 4. /usr/bin/vim.tiny Choose 1-4 [2]:
-
Créez une tâche planifiée simple qui exécute la commande
date
tous les vendredi à 01:00 de l’après-midi. Où pouvez-vous voir le résultat de cette tâche ?00 13 * * 5 date
Le résultat est envoyé par e-mail à l’utilisateur ; pour le visualiser, vous pouvez utiliser la commande
mail
. -
Créez une autre tâche planifiée qui exécute le script
foobar.sh
toutes les minutes, en redirigeant la sortie vers le fichieroutput.log
dans votre répertoire personnel de façon à ce que seule l’erreur standard vous soit envoyée par e-mail.*/1 * * * * ./foobar.sh >> output.log
-
Jetez un œil à l’entrée
crontab
de la tâche planifiée nouvellement créée. Pourquoi ne pas préciser le chemin absolu du fichier dans lequel la sortie standard est sauvegardée ? Et pourquoi utiliser la commande./foobar.sh
pour exécuter le script ?cron
invoque les commandes depuis le répertoire personnel de l’utilisateur, à moins qu’un autre emplacement ne soit spécifié par la variable d’environnementHOME
dans le fichiercrontab
. Pour cette raison, vous pouvez utiliser le chemin relatif du fichier de sortie et lancer le script avec./foobar.sh
. -
Éditez l’entrée
crontab
précédente en supprimant la redirection de sortie et désactivez la première tâche cron que vous avez créée.#00 13 * * 5 date */1 * * * * ./foobar.sh
Pour désactiver une tâche cron, il suffit de commenter la ligne correspondante dans le fichier
crontab
. -
Comment faire pour envoyer le résultat ainsi que les erreurs de votre tâche planifiée au compte utilisateur
emma
par e-mail ? Et comment éviter d’envoyer la sortie standard et les erreurs par e-mail ?Pour envoyer la sortie standard et les erreurs à
emma
, vous devez définir la variable d’environnementMAILTO
dans votre fichiercrontab
comme ceci :MAILTO="emma"
Pour indiquer à
cron
qu’aucun e-mail ne doit être envoyé, vous pouvez assigner une valeur vide à la variable d’environnementMAILTO
.MAILTO=""
-
Exécutez la commande
ls -l /usr/bin/crontab
. Quelle permission spéciale est activée et quelle est sa signification ?$ ls -l /usr/bin/crontab -rwxr-sr-x 1 root crontab 25104 feb 10 2015 /usr/bin/crontab
La commande
crontab
a le bit SGID défini (le caractères
à la place du fanion exécutable pour le groupe), ce qui signifie qu’elle est exécutée avec les privilèges du groupe (en l’occurrencecrontab
). C’est pourquoi les utilisateurs lambda peuvent éditer leur fichiercrontab
en utilisant la commandecrontab
. Notez que dans la plupart des distributions, les permissions sur les fichiers sont définies de telle sorte que les fichierscrontab
ne peuvent être édités que par la commandecrontab
.