Tutoriel Linux crontab avec des exemples
Si vous avez déjà une certaine expérience en tant qu’administrateur système Linux, il y a de fortes chances que vous sachiez ce qu’est cron et ce qu’il fait. Si vous commencez tout juste à travailler avec Linux, ce sont des connaissances essentielles qui vous serviront certainement plus tard. Quoi qu’il en soit, si vous avez déjà les connaissances, cet article les rafraîchira. Si ce n’est pas le cas, vous obtiendrez un guide pour vous lancer. On s’attend donc à ce que vous n’ayez que quelques connaissances de base des systèmes Linux et, comme d’habitude, une envie d’apprendre.
Le nom de Cron vient de Chronos, la personnification grecque du temps. Et c’est un choix très inspiré, car cron vous aide à planifier différentes tâches que vous souhaitez que votre système effectue à des moments donnés. Si vous avez utilisé des systèmes Windows, il y a de fortes chances que vous soyez tombé sur l’outil Tâches planifiées. D’une manière générale, le but est le même, les différences sont... Eh bien, il y en a trop pour les nommer ici.
L’idée est que cron est plus flexible et approprié pour les tâches sérieuses de gestion du système. Si vous avez besoin d’exemples de cas d’utilisation, pensez simplement aux sauvegardes : voulez-vous effectuer des tâches de sauvegarde alors que vous êtes responsable de centaines de machines ? Nous ne le pensions pas. Il vous suffit d’écrire un simple script Bash à l’aide de rsync, par exemple, de le programmer pour qu’il s’exécute, disons, quotidiennement et de l’oublier. Tout ce que vous avez à faire maintenant est de vérifier les journaux de temps en temps. Nous connaissons même des gens qui utilisent cron pour se rappeler des événements personnels importants, comme les anniversaires.
Mais cron n’est qu’un démon qui exécute les tâches que vous lui demandez d’exécuter. Existe-t-il un outil pour nous aider à modifier/ajouter/supprimer ces tâches ? Bien sûr, et ça s’appelle crontab (le nom vient de la table cron). Mais commençons par le début. Lisez la suite pour savoir comment utiliser cron.
Dans ce tutoriel, vous allez apprendre :
- Est-il nécessaire d’installer cron sur Linux ?
- Comment cron pour planifier des tâches
- Plusieurs exemples de crontab pour les tâches annuelles, mensuelles, quotidiennes, etc.
- Comment utiliser les fichiers cron dans le répertoire
/etc/
Dois-je installer cron ?
La plupart des distributions Linux utilisent Vixie Cron ou un dérivé (Fedora) comme implémentation par défaut de cron, et c’est ce que nous allons utiliser dans cet article. De plus, la plupart des distributions sont livrées avec cron déjà installé, car c’est une partie très importante de tout système Linux. Bien que vous, si vous êtes un utilisateur de bureau, n’ayez jamais besoin de l’utiliser directement, votre système ou certaines applications installées le pourraient (la mise à jour périodique de la base de données des pages de manuel en est un bon exemple).
Donc, en gros, il n’y a pas grand-chose que nous puissions écrire dans cette section, car la plupart des distributions que nous connaissons incluent cron dans le système de base. Une exception notable est Gentoo, où vous devez installer vixie-cron à la main et l’ajouter au niveau d’exécution par défaut. Arch, Debian et Slackware, ainsi que toutes les versions d’Ubuntu, Fedora et OpenSUSE ont tous cron installé dans la base et configuré pour démarrer au démarrage. Nous vous suggérons (fortement, en fait) de lire les pages de manuel cron et crontab, car de nombreuses distributions Linux corrigent leurs logiciels afin de mieux s’adapter au reste du système.
Il y a donc des chances qu’une fonctionnalité que vous trouverez sur Gentoo, par exemple, ne soit pas disponible sur Slackware. Et de toute façon, rien ne se compare à la lecture du manuel, surtout lorsqu’il s’agit d’un nouveau logiciel que vous allez utiliser assez souvent.
Comment utiliser cron
Maintenant, mettons cron au travail. Ce à quoi nous devons d’abord penser, c’est à quelle commande nous devons exécuter. Nécessite-t-il des privilèges root ou non ? Supposons pour l’instant que nous utiliserons crontab pour ajouter un script simple à exécuter toutes les cinq minutes, en tant qu’utilisateur normal.
Exemple Cron
Écrivons un script simple qui présentera une boîte de dialogue simple basée sur des malédictions dans un terminal (nécessite une boîte de dialogue et un émulateur de terminal - nous utiliserons xterm ici) :
#!/bin/sh
xterm -e "dialog --msgbox 'Testing cron...' 234 234"
This is a very simple example, treat it as it is
Nommez le fichier crontest.sh et rendez-le exécutable, car tout ce qui sera exécuté par cron doit être exécutable.
chmod +x crontest.sh
Et maintenant, nous devons modifier la crontab de notre utilisateur afin d’ajouter une entrée pour notre merveilleux script :
crontab -e
-e signifie modifier et -r signifie supprimer.
Soyez très prudent ! De nombreux administrateurs système, par fatigue ou par négligence, ont tapé
-r au lieu de -e, puisque les clés sont juste à côté les unes des autres, et ont supprimé toutes leurs entrées crontab. Quoi qu’il en soit, vous verrez très probablement un fichier commenté (crontab utilise des # pour les commentaires) qui vous donne des exemples et explique ce que fait chaque champ. Oui, une entrée crontab est composée de champs, le dernier spécifiant la commande à exécuter et le reste étant des entrées temporelles, comme nous le verrons.
Maintenant, notre entrée dans crontab pour que notre script soit exécuté toutes les cinq minutes est :
*/5 * * * * export DISPLAY=:0 && /home/$user/crontest.sh
Nous devons exporter la variable DISPLAY pour que xterm ne nous envoie pas d’erreurs « DISPLAY is not set « . Voyons maintenant ce que fait chaque champ.
Champs Crontab
Si vous avez déjà utilisé des caractères génériques, vous connaissez les astérisques dans crontab : ils signifient « correspondre à toutes les valeurs ». Les champs d’un crontab Linux par défaut (attention, certains autres systèmes Unix peuvent avoir des implémentations cron différentes) signifient, de gauche à droite : minute, heure, jour du mois, mois, jour de la semaine, année (non obligatoire) et commande, respectivement.
Donc, si nous voulions exécuter notre script à chaque fois à cinq minutes et à chaque heure, chaque jour, chaque mois et chaque année, nous l’aurions simplement fait :
5 * * * * export DISPLAY=:0 && /home/$user/crontest.sh
Nous vous exhortons à faire attention au champ du jour de la semaine : peut-être que dans votre pays, le premier jour de la semaine est le lundi, mais il existe d’autres cultures qui ont le premier jour de la semaine fixé au dimanche. Il y a des différences culturelles et religieuses dont vous devez tenir compte si vous travaillez dans des environnements multinationaux et multiculturels.
Par défaut ($user@$hostname), Cron envoie des notifications par e-mail à l’utilisateur propriétaire de la tâche. Si vous souhaitez modifier l’adresse, utilisez simplement MAILTO=$email_address dans votre crontab. Si vous souhaitez désactiver cela, mettez >/dev/null 2>&1 à la fin de votre entrée.
Maintenant, si vous en avez déjà marre de cette fenêtre contextuelle qui s’affiche toutes les cinq minutes, utilisez à nouveau crontab -e pour la supprimer, ou, plus simplement, commentez-la. Si vous voulez voir ce qu’il y a dans votre crontab, utilisez simplement l’option -l (liste). Nous vous invitons à vous amuser, à créer de nouvelles entrées et à voir si elles fonctionnent comme vous l’attendiez.
Fichiers Cron dans le répertoire /etc
Ce que nous avons fait auparavant n’était que quelque chose de trivial et potentiellement drôle pour vous aider à démarrer. À partir de maintenant, nous supposerons que vous avez des affaires sérieuses à régler et nous irons dans cette direction. Le sous-titre ci-dessus fait référence aux répertoires dans /etc qui prennent en charge les tâches périodiques de maintenance du système.
Par exemple, puisque nous y avons fait référence plus tôt, notre fichier /etc/cron.weekly contient un script appelé man-db qui met à jour la base de données des pages de manuel. Il s’agit de scripts fournis avec votre distribution et exécutés selon le fichier /etc/crontab.
Étant donné que la meilleure façon d’apprendre est de faire des recherches, prenez votre temps pour parcourir ce fichier vous-même. Vous verrez des entrées similaires à ce que vous avez lu auparavant, seules les commandes à exécuter différeront. run-parts est un petit utilitaire conçu pour exécuter tous les scripts d’un dossier donné, qui sont les scripts de cron.{ horaire, quotidien, hebdomadaire, mensuel}. Assurez-vous de comprendre quand ils sont configurés pour fonctionner et pourquoi ces heures/jours sont choisis comme ils le sont.
Le lecteur attentif a peut-être remarqué qu’il y a un champ dans /etc/crontab qui n’était pas présent lors de l’édition de son crontab : un champ utilisateur. L’explication est simple et la raison est la sécurité. Si vous appelez crontab -e en tant que $user, il est certain que toute commande planifiée sera exécutée comme $user.
Mais comme /etc/crontab est à l’échelle du système, il semble nécessaire de spécifier l’utilisateur, car il peut y avoir certains scripts ou applications qui devront s’exécuter en tant qu’autre utilisateur, et non en tant que root, surtout si l’administrateur système est conscient de la sécurité et ajoute des utilisateurs et des groupes au système au fur et à mesure que le besoin s’en fait sentir.
Un exemple : pour les sauvegardes, vous n’aurez pas besoin de toute la puissance de l’utilisateur root, seulement des droits nécessaires pour lire et écrire des emplacements spécifiques (il y a plus que cela, mais restons simples). Ainsi, l’administrateur crée un groupe de sauvegardes et un utilisateur backupadmin, avec les droits nécessaires, et exécute les scripts de sauvegarde nocturne via cron comme ceci :
30 23 * * * backupadmin /home/backupadmin/nightlybkup.sh
Cela exécutera le script spécifié dans le dernier champ tous les soirs à 23h30. Maintenant, si nous voulions que les sauvegardes ne soient exécutées que du lundi au vendredi, nous aurions fait ceci :
30 23 * * 1-5 backupadmin /home/backupadmin/nightlybkup.sh
Si vous ne voulez des sauvegardes que la nuit, mais seulement les lundis, mercredis et vendredis, remplacez 1-5 par 1,3,5. Une fois que vous vous mouillez les pieds et que vous savez exactement ce dont vous avez besoin, cron deviendra facile à utiliser et facile à comprendre.
Considérations relatives à la sécurité
Il existe de nombreuses situations dans lesquelles vous ne souhaitez pas autoriser chaque utilisateur ayant accès à votre système à créer des entrées crontab. C’est là que /etc/cron.deny et /etc/cron.allow entrent en jeu. Leur utilisation est fondamentalement la même que celle de /etc/hosts.allow et /etc/hosts.deny, donc si vous avez utilisé ces fichiers dans le passé, vous vous sentirez comme chez vous. Ces deux fichiers (cron.deny et cron.allow) n’existent pas par défaut, du moins sur les systèmes avec lesquels nous travaillons, donc le comportement par défaut est de permettre à tout le monde d’avoir ses entrées crontab. Vous pouvez vérifier avec quels fichiers liés à cron vous avez dans /etc
ls /etc | grep cron
Encore une fois, ce n’est que sous Linux, car l’absence de ces fichiers sur les systèmes Solaris signifie exactement le contraire, en plus les fichiers ont des emplacements différents. cron.allow est vérifié en premier, nous entrons donc généralement ALL dans cron.deny puis n’entrons que les utilisateurs auxquels nous voulons donner accès dans cron.allow.
Exemples de planificateur Cron
Afin de vous familiariser avec la syntaxe crontab, qui est un peu déroutante au début, nous avons compilé une liste de divers exemples qui planifieront des tâches pour toutes sortes de moments et de fréquences différents.
Exécutez un script toutes les minutes :
* * * * * /usr/local/bin/check-disk-space.shCette commande sera exécutée toutes les minutes, tous les jours et tous les mois.
Cette commande exécutera le script
checkdrive.shà 02:30 tous les 10 janvier, juin et décembre.30 02 10 01,06,12 * /home/$user/bin/checkdrive.shExécutez le script toutes les demi-heures :
00,30 * * * * /home/$user/backupdata.shFonctionne uniquement les fins de semaine :
* * * * 6,7 /usr/bin/weekendCourez deux fois par jour. Celle-ci se déroulera tous les jours à 11h20 et 16h20.
20 11,16 * * * /usr/sbin/commandCela se déroulera toutes les heures tous les 2 mai.
01 * 2 05 * /sbin/system_commandLa commande ci-dessous s’exécutera du lundi au vendredi toutes les 10 minutes.
*/10 * * * 1-5 /usr/local/bin/check-disk-space.shCette commande sera exécutée une fois pendant les heures et les jours ouvrables.
00 09-17 * * 1-5 /usr/local/bin/check-disk-space.shCet ordre ne sera exécuté qu’une fois par an, à minuit, le 1er janvier
0 0 1 1 * /usr/local/bin/check-disk-space.shCette commande sera exécutée deux fois par an (tous les 6 mois) à 12h et 12h.
0 0,12 1 */6 * /usr/local/bin/check-disk-space.shCette commande sera exécutée tous les 3 jeudis d’un mois donné à 10 heures.
0 10 15-21 * 4 /usr/local/bin/check-disk-space.shCette commande sera exécutée tous les jours 20 minutes après toutes les heures paires (0:20, 2:20... 22:20).
20 0-23/2 * * * /usr/local/bin/check-disk-space.sh
Réflexions finales
Même si vous pouvez trouver les entrées cron un peu intimidantes au début, après un court moment, vous vous souviendrez de l’ordre et de la signification des champs et, puisque vous savez maintenant où se trouvent les fichiers à modifier, la planification à l’aide de cron deviendra un jeu d’enfant. Tout ce qu’il faudra, c’est un peu de pratique.

