GNU/Linux >> Tutoriels Linux >  >> Linux

Comment j'utilise cron sous Linux

L'un des défis (parmi les nombreux avantages) d'être un administrateur système est d'exécuter des tâches lorsque vous préférez dormir. Par exemple, certaines tâches (y compris les tâches récurrentes) doivent s'exécuter pendant la nuit ou le week-end, lorsque personne n'est censé utiliser les ressources informatiques. Je n'ai pas de temps à perdre le soir pour exécuter des commandes et des scripts qui doivent fonctionner pendant les heures creuses. Et je ne veux pas avoir à me lever à 00h00 pour lancer une sauvegarde ou une mise à jour majeure.

Au lieu de cela, j'utilise deux utilitaires de service qui me permettent d'exécuter des commandes, des programmes et des tâches à des moments prédéterminés. Le cron et à Les services permettent aux administrateurs système de programmer des tâches à exécuter à un moment précis dans le futur. Le service at spécifie une tâche unique qui s'exécute à un certain moment. Le service cron peut planifier des tâches de manière répétitive, par exemple quotidiennement, hebdomadairement ou mensuellement.

Dans cet article, je vais vous présenter le service cron et comment l'utiliser.

Utilisations courantes (et peu courantes) de cron

J'utilise le cron service pour planifier des choses évidentes, comme des sauvegardes régulières qui se produisent tous les jours à 2 heures du matin. Je l'utilise aussi pour des choses moins évidentes.

  • Les heures système (c'est-à-dire l'heure du système d'exploitation) sur mes nombreux ordinateurs sont définies à l'aide du protocole NTP (Network Time Protocol). Alors que NTP définit l'heure système, il ne définit pas l'heure matérielle, qui peut dériver. J'utilise cron pour définir l'heure du matériel en fonction de l'heure du système.
  • J'ai aussi un programme Bash que j'exécute tôt chaque matin et qui crée un nouveau "message du jour" (MOTD) sur chaque ordinateur. Il contient des informations, telles que l'utilisation du disque, qui doivent être à jour pour être utiles.
  • De nombreux processus et services système, tels que Logwatch, logrotate et Rootkit Hunter, utilisent le service cron pour planifier des tâches et exécuter des programmes tous les jours.

La crond daemon est le service d'arrière-plan qui active la fonctionnalité cron.

Le service cron vérifie les fichiers dans /var/spool/cron et /etc/cron.d répertoires et les répertoires /etc/anacrontab dossier. Le contenu de ces fichiers définit les tâches cron qui doivent être exécutées à différents intervalles. Les fichiers cron des utilisateurs individuels se trouvent dans /var/spool/cron , et les services et applications système ajoutent généralement des fichiers de travail cron dans /etc/cron.d annuaire. Le /etc/anacrontab est un cas particulier qui sera traité plus loin dans cet article.

Utiliser crontab

L'utilitaire cron s'exécute en fonction des commandes spécifiées dans une table cron (crontab ). Chaque utilisateur, y compris root, peut avoir un fichier cron. Ces fichiers n'existent pas par défaut, mais peuvent être créés dans /var/spool/cron répertoire en utilisant le crontab -e commande qui est également utilisée pour modifier un fichier cron (voir le script ci-dessous). Je vous déconseille fortement de ne pas utilisez un éditeur standard (tel que Vi, Vim, Emacs, Nano ou l'un des nombreux autres éditeurs disponibles). Utilisation de la crontab La commande vous permet non seulement de modifier la commande, mais également de redémarrer le crond démon lorsque vous enregistrez et quittez l'éditeur. La crontab La commande utilise Vi comme éditeur sous-jacent, car Vi est toujours présent (même sur les installations les plus basiques).

Les nouveaux fichiers cron sont vides, les commandes doivent donc être ajoutées à partir de zéro. J'ai ajouté l'exemple de définition de travail ci-dessous à mes propres fichiers cron, juste comme référence rapide, afin que je sache ce que signifient les différentes parties d'une commande. N'hésitez pas à le copier pour votre propre usage.

# crontab -e
SHELL=/bin/bash
[email protected]
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

# 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

# backup using the rsbu program to the internal 4TB HDD and then 4TB external
01 01 * * * /usr/local/bin/rsbu -vbd1 ; /usr/local/bin/rsbu -vbd2

# Set the hardware clock to keep it in sync with the more accurate system clock
03 05 * * * /sbin/hwclock --systohc

# Perform monthly updates on the first of the month
# 25 04 1 * * /usr/bin/dnf -y update

Les trois premières lignes du code ci-dessus définissent un environnement par défaut. L'environnement doit être défini sur tout ce qui est nécessaire pour un utilisateur donné, car cron ne fournit aucun environnement d'aucune sorte. La COQUILLE La variable spécifie le shell à utiliser lorsque les commandes sont exécutées. Cet exemple spécifie le shell Bash. Le MAILTO La variable définit l'adresse e-mail à laquelle les résultats de la tâche cron seront envoyés. Ces e-mails peuvent fournir l'état de la tâche cron (sauvegardes, mises à jour, etc.) et consistent en la sortie que vous verriez si vous exécutiez le programme manuellement à partir de la ligne de commande. La troisième ligne définit le PATH Pour l'environnement. Même si le chemin est défini ici, j'ajoute toujours le chemin complet à chaque exécutable.

L'exemple ci-dessus contient plusieurs lignes de commentaires qui détaillent la syntaxe requise pour définir une tâche cron. Je vais décomposer ces commandes, puis en ajouter quelques autres pour vous montrer des fonctionnalités plus avancées des fichiers crontab.

01 01 * * * /usr/local/bin/rsbu -vbd1 ; /usr/local/bin/rsbu -vbd2

Cette ligne exécute mon script shell Bash auto-écrit, rsbu , qui sauvegarde tous mes systèmes. Cette tâche commence à 1 h 01 (01 01) tous les jours. Les astérisques (*) aux positions trois, quatre et cinq de la spécification temporelle sont comme des globs de fichiers ou des caractères génériques pour les autres divisions temporelles ; ils précisent "tous les jours du mois", "tous les mois" et "tous les jours de la semaine". Cette ligne exécute mes sauvegardes deux fois ; l'un sauvegarde sur un disque dur de sauvegarde interne dédié et l'autre sur un lecteur USB externe que je peux apporter au coffre-fort.

La ligne suivante définit l'horloge matérielle de l'ordinateur en utilisant l'horloge système comme source d'une heure précise. Cette ligne est configurée pour fonctionner à 5h03 (03 05) tous les jours.

03 05 * * * /sbin/hwclock --systohc

J'utilisais le troisième et dernier travail cron (commenté) pour effectuer un dnf ou miam mise à jour à 04h25 le premier jour de chaque mois, mais je l'ai commentée pour qu'elle ne fonctionne plus.

# 25 04 1 * * /usr/bin/dnf -y update

Autres astuces de planification

Faisons maintenant des choses un peu plus intéressantes que ces bases. Supposons que vous souhaitiez exécuter une tâche particulière tous les jeudis à 15 h :

00 15 * * Thu /usr/local/bin/mycronjob.sh

Ou, peut-être devez-vous exécuter des rapports trimestriels après la fin de chaque trimestre. Le service cron n'a pas d'option pour "Le dernier jour du mois", vous pouvez donc utiliser le premier jour du mois suivant, comme indiqué ci-dessous. (Cela suppose que les données nécessaires aux rapports seront prêtes lorsque la tâche sera configurée pour s'exécuter.)

02 03 1 1,4,7,10 * /usr/local/bin/reports.sh

L'exemple suivant montre une tâche qui s'exécute une minute après chaque heure entre 9h01 et 17h01.

01 09-17 * * * /usr/local/bin/hourlyreminder.sh

J'ai rencontré des situations où je devais exécuter une tâche toutes les deux, trois ou quatre heures. Cela peut être accompli en divisant les heures par l'intervalle souhaité, tel que */3 toutes les trois heures, ou 6-18/3 à courir toutes les trois heures entre 6 h et 18 h. D'autres intervalles peuvent être divisés de la même manière ; par exemple, l'expression */15 dans la position des minutes signifie "exécuter le travail toutes les 15 minutes."

*/5 08-18/2 * * * /usr/local/bin/mycronjob.sh

Une chose à noter :les expressions de division doivent aboutir à un reste de zéro pour que le travail s'exécute. C'est pourquoi, dans cet exemple, la tâche est configurée pour s'exécuter toutes les cinq minutes (08h05, 08h10, 08h15, etc.) pendant les heures paires de 8h00 à 18h00, mais pas pendant les heures impaires. heures numérotées. Par exemple, la tâche ne s'exécutera pas du tout à partir de 21 h 00. à 9h59

Je suis sûr que vous pouvez trouver de nombreuses autres possibilités basées sur ces exemples.

Limiter l'accès cron

Plus de ressources Linux

  • Aide-mémoire des commandes Linux
  • Aide-mémoire des commandes Linux avancées
  • Cours en ligne gratuit :Présentation technique de RHEL
  • Aide-mémoire sur le réseau Linux
  • Aide-mémoire SELinux
  • Aide-mémoire sur les commandes courantes de Linux
  • Que sont les conteneurs Linux ?
  • Nos derniers articles Linux

Les utilisateurs réguliers disposant d'un accès cron peuvent commettre des erreurs qui, par exemple, peuvent saturer les ressources système (telles que la mémoire et le temps processeur). Pour éviter toute utilisation abusive, l'administrateur système peut limiter l'accès des utilisateurs en créant un /etc/cron.allow fichier contenant une liste de tous les utilisateurs autorisés à créer des tâches cron. L'utilisateur root ne peut pas être empêché d'utiliser cron.

En empêchant les utilisateurs non root de créer leurs propres tâches cron, il peut être nécessaire que root ajoute leurs tâches cron à la crontab root. "Mais attendez!" vous dites. "Est-ce que cela n'exécute pas ces travaux en tant que root?" Pas nécessairement. Dans le premier exemple de cet article, le champ de nom d'utilisateur affiché dans les commentaires peut être utilisé pour spécifier l'ID utilisateur qu'un travail doit avoir lors de son exécution. Cela empêche les travaux de l'utilisateur non root spécifié de s'exécuter en tant que root. L'exemple suivant montre une définition de tâche qui exécute une tâche en tant qu'utilisateur "student" :

04 07 * * * student /usr/local/bin/mycronjob.sh

Si aucun utilisateur n'est spécifié, le travail est exécuté en tant qu'utilisateur propriétaire du fichier crontab, root dans ce cas.

cron.d

Le répertoire /etc/cron.d C'est là que certaines applications, telles que SpamAssassin et sysstat, installent les fichiers cron. Parce qu'il n'y a pas d'utilisateur spamassassin ou sysstat, ces programmes ont besoin d'un emplacement pour localiser les fichiers cron, ils sont donc placés dans /etc/cron.d .

Le /etc/cron.d/sysstat Le fichier ci-dessous contient des tâches cron liées au rapport d'activité du système (SAR). Ces fichiers cron ont le même format qu'un fichier cron utilisateur.

# Run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib64/sa/sa1 1 1
# Generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib64/sa/sa2 -A

Le fichier cron sysstat comporte deux lignes qui effectuent des tâches. La première ligne exécute le sa1 programmez toutes les 10 minutes pour collecter les données stockées dans des fichiers binaires spéciaux dans /var/log/sa annuaire. Puis, tous les soirs à 23h53, le sa2 programme s'exécute pour créer un résumé quotidien.

Conseils de planification

Certaines des heures que j'ai définies dans les fichiers crontab semblent plutôt aléatoires - et dans une certaine mesure, elles le sont. Essayer de planifier des tâches cron peut être difficile, d'autant plus que le nombre de tâches augmente. Je n'ai généralement que quelques tâches à planifier sur chacun de mes ordinateurs, ce qui est plus simple que dans certains des environnements de production et de laboratoire où j'ai travaillé.

Un système que j'administrais avait environ une douzaine de tâches cron qui s'exécutaient toutes les nuits et trois ou quatre supplémentaires qui s'exécutaient le week-end ou le premier du mois. C'était un défi, car si trop de tâches s'exécutaient en même temps, en particulier les sauvegardes et les compilations, le système manquait de RAM et remplissait presque le fichier d'échange, ce qui entraînait un blocage du système alors que les performances diminuaient, donc rien n'était fait. Nous avons ajouté plus de mémoire et amélioré la planification des tâches. Nous avons également supprimé une tâche qui était très mal écrite et utilisait de grandes quantités de mémoire.

Le service crond suppose que l'ordinateur hôte fonctionne tout le temps. Cela signifie que si l'ordinateur est éteint pendant une période où l'exécution des tâches cron était planifiée, elles ne s'exécuteront pas avant la prochaine fois qu'elles seront planifiées. Cela peut causer des problèmes s'il s'agit de tâches cron critiques. Heureusement, il existe une autre option pour exécuter des tâches à intervalles réguliers :anacron .

anacron

Le programme anacron remplit la même fonction que crond, mais il ajoute la possibilité d'exécuter des tâches qui ont été ignorées, par exemple si l'ordinateur était éteint ou autrement incapable d'exécuter la tâche pendant un ou plusieurs cycles. Ceci est très utile pour les ordinateurs portables et autres ordinateurs qui sont éteints ou mis en mode veille.

Dès que l'ordinateur est allumé et démarré, anacron vérifie si les travaux configurés ont raté leur dernière exécution planifiée. Si c'est le cas, ces tâches s'exécutent immédiatement, mais une seule fois (quel que soit le nombre de cycles manqués). Par exemple, si une tâche hebdomadaire n'a pas été exécutée pendant trois semaines parce que le système a été arrêté pendant que vous étiez en vacances, elle serait exécutée peu de temps après la mise sous tension de l'ordinateur, mais une seule fois, pas trois.

Le programme anacron fournit des options simples pour exécuter des tâches planifiées régulièrement. Installez simplement vos scripts dans /etc/cron.[hourly|daily|weekly|monthly] répertoires, en fonction de la fréquence à laquelle ils doivent être exécutés.

Comment cela marche-t-il? La séquence est plus simple qu'il n'y paraît.

  1. Le service crond exécute la tâche cron spécifiée dans /etc/cron.d/0hourly .
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly

  1. La tâche cron spécifiée dans /etc/cron.d/0hourly exécute les run-parts programmer une fois par heure.
  2. Les pièces d'exécution programme exécute tous les scripts situés dans le /etc/cron.hourly répertoire.
  3. Le /etc/cron.hourly répertoire contient le 0anacron script, qui exécute le programme anacron à l'aide de /etdc/anacrontab fichier de configuration affiché ici.
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

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

  1. Le programme anacron exécute les programmes situés dans /etc/cron.daily une fois par jour ; il exécute les tâches situées dans /etc/cron.weekly une fois par semaine, et les travaux dans cron.monthly une fois par mois. Notez les délais spécifiés dans chaque ligne pour éviter que ces tâches ne se chevauchent avec d'autres tâches cron.

Au lieu de placer des programmes Bash complets dans le cron.X répertoires, je les installe dans le répertoire /usr/local/bin répertoire, ce qui me permet de les exécuter facilement depuis la ligne de commande. Ensuite, j'ajoute un lien symbolique dans le répertoire cron approprié, tel que /etc/cron.daily .

Le programme anacron n'est pas conçu pour exécuter des programmes à des moments précis. Il est plutôt destiné à exécuter des programmes à des intervalles qui commencent aux heures spécifiées, par exemple à 3 heures du matin (voir la START_HOURS_RANGE ligne dans le script juste au-dessus) de chaque jour, le dimanche (pour commencer la semaine), et le premier jour du mois. Si un ou plusieurs cycles sont manqués, anacron exécutera les tâches manquées une fois, dès que possible.

Raccourcis

Le /etc/anacrontab Le fichier ci-dessus nous montre un indice sur la façon dont nous pouvons utiliser des raccourcis pour quelques moments spécifiques et courants. Ces raccourcis temporels en un seul mot peuvent être utilisés pour remplacer les cinq champs habituellement utilisés pour spécifier les heures. Le @ Le caractère est utilisé pour identifier les raccourcis vers cron. La liste ci-dessous, extraite de la page de manuel crontab(5), montre les raccourcis avec leurs significations équivalentes.

  • @reboot :exécuté une fois après le redémarrage.
  • @yearly :exécuté une fois par an, c'est-à-dire. 0 0 1 1 *
  • @annually :exécuté une fois par an, c'est-à-dire. 0 0 1 1 *
  • @monthly :exécuté une fois par mois, c'est-à-dire. 0 0 1 * *
  • @weekly :exécuté une fois par semaine, c'est-à-dire. 0 0 * * 0
  • @daily :exécuté une fois par jour, c'est-à-dire. 0 0 * * *
  • @hourly :exécuté une fois par heure, c'est-à-dire. 0 * * * *

Ces raccourcis peuvent être utilisés dans n'importe quel fichier crontab, comme ceux de /etc/cron.d .

En savoir plus sur la définition des limites

J'utilise la plupart de ces méthodes pour planifier des tâches à exécuter sur mes ordinateurs. Toutes ces tâches doivent être exécutées avec les privilèges root. D'après mon expérience, il est rare que les utilisateurs réguliers aient vraiment besoin d'une tâche cron. Un cas était un utilisateur développeur qui avait besoin d'une tâche cron pour lancer une compilation quotidienne dans un laboratoire de développement.

Il est important de limiter l'accès aux fonctions cron aux utilisateurs non root. Cependant, il existe des circonstances dans lesquelles un utilisateur doit définir une tâche pour qu'elle s'exécute à des heures prédéfinies, et cron peut lui permettre de le faire. De nombreux utilisateurs ne comprennent pas comment configurer correctement ces tâches à l'aide de cron et font des erreurs. Ces erreurs peuvent être inoffensives, mais, le plus souvent, elles peuvent causer des problèmes. En définissant des politiques fonctionnelles qui amènent les utilisateurs à interagir avec l'administrateur système, les tâches cron individuelles sont beaucoup moins susceptibles d'interférer avec d'autres utilisateurs et d'autres fonctions du système.

Il est possible de fixer des limites sur les ressources totales qui peuvent être allouées à des utilisateurs individuels ou à des groupes, mais c'est un article pour une autre fois.

Pour plus d'informations, les pages de manuel de cron, crontab, anacron, anacrontab et run-parts contiennent toutes d'excellentes informations et descriptions sur le fonctionnement du système cron.

Cet article a été initialement publié en novembre 2017 et a été mis à jour pour inclure des informations supplémentaires.


Linux
  1. Comment utiliser BusyBox sous Linux

  2. Comment utiliser cron sous Linux

  3. Comment utiliser FIND sous Linux

  4. Comment utiliser Décompresser sous Linux

  5. Comment utiliser la commande Su sous Linux

Comment utiliser l'écran Linux

Comment répertorier les tâches Cron sous Linux

Comment utiliser du Command sous Linux

Comment utiliser le terminal Linux dans Android

Comment utiliser la commande sysctl sous Linux

Comment utiliser la commande d'arrêt de Linux