Cron

De ArchwikiFR

Cron est un service de planification qui permet l'exécution de commandes de manière périodique.

Sommaire

Installation

Cron se trouve dans le dépôt core, il s'agit du paquet cronie qui appartient au groupe base. Il doit donc naturellement être installé sur votre machine.

Il existe d'autres paquets assurant les tâches cron, comme dcron ou fcron.

Lancement

Vu qu'il s'agit d'un service, avant de pouvoir utiliser cron il faut le démarrer:

systemctl start cronie

et pour un démarrage automatique:

systemctl enable cronie

Utilisation de cron

Cron permet d'exécuter des commandes à des moments précis. On peut faire la distinction entre deux façons d'utiliser ce service. L'usage des répertoires cron.* dans un premier temps et la modification du fichier spécial crontab par la suite.

Utilisation des répertoires

Cette méthode est la plus simple des deux. Dès que le service est démarré, il va périodiquement visiter des répertoires et exécuter tous les scripts présents dans ceux-ci. Les répertoires, situés dans /etc sont les suivants :

  • cron.daily : exécuté une fois par jour
  • cron.hourly : exécuté une fois par heure
  • cron.monthly : exécuté une fois par mois
  • cron.weekly : exécuté une fois par semaine

Partant de là, pour qu'un script soit exécuté tous les jours, il suffit de le placer dans le dossier /etc/cron.daily et de le rendre exécutable. Si ce qui vous importe est que le script tourne dans la journée, peu importe l'heure, c'est suffisant. Si vous voulez qu'il soit lancé à une heure précise tous les jours, il faut passer à l'autre méthode.

Attention: Il faut être superutilisateur pour pouvoir placer un fichier dans l'un des dossiers /etc/cron.*, il ne devrait donc pas y avoir de script d'utilisateur ici: seulement des tâches système (ne pas oublier de rendre vos propres scripts exécutables, de préférence avec des permissions 744, rwxr--r-- ).

Utilisation du fichier crontab

Dans cette méthode, il s'agit d'éditer le fichier spécial crontab pour y définir les commandes que l'on veut voir exécutées ( exemple : pacman -Syuw --noprogressbar --noconfirm ) ainsi que les informations temporelles indiquant le moment où l'on veut que ces commandes soient exécutées ( exemple : les lundis, mercredis et vendredis à 13h37 ).

Tout utilisateur (membre du groupe users), root compris, a à disposition son propre crontab (qui sera créé dans /var/spool/cron/<username> ). Il ne doit en aucun cas être édité directement. Si l'on veut consulter ou modifier le fichier, il faut utiliser la commande crontab.

Pour consulter les tâches actuelles:

crontab -l

Qui devrait vous donner un résultat similaire à ceci lors de son premier lancement:

no crontab for root
Note: Pour le cas où vous utiliseriez dcron, la table n'est pas vide en root:
# root crontab
# DO NOT EDIT THIS FILE MANUALLY! USE crontab -e INSTEAD

# man 1 crontab for acceptable formats:
#    <minute> <hour> <day> <month> <dow> <tags and command>
#    <@freq> <tags and command>

# SYSTEM DAILY/WEEKLY/... FOLDERS
@hourly         ID=sys-hourly   /usr/sbin/run-cron /etc/cron.hourly
@daily          ID=sys-daily    /usr/sbin/run-cron /etc/cron.daily
@weekly         ID=sys-weekly   /usr/sbin/run-cron /etc/cron.weekly
@monthly        ID=sys-monthly  /usr/sbin/run-cron /etc/cron.monthly
À la différence de cronie, avant même de commencer, il y a déjà 4 tâches planifiées dans votre système. Il s'agit en fait de ce qui permet d'utiliser la première méthode ci-dessus (cronie le fait également mais avec une organisation différente). Les dossiers qu'on a vu précédemment sont en réalité parcourus par ces tâches cron. En ce qui concerne le moment d'exécution, nous ne sommes pas plus avancés, on a spécifié au service des informations comme @hourly. En fait, c'est très bien comme ça. Ce qui nous intéresse c'est que ce soit fait une fois par heure, peu importe quand dans l'heure.

Maintenant, si l'on veut que soit exécutée à un moment précis comme, par exemple, à l'heure pile (xx:00), une tâche précise, il faut fixer les contraintes sur chaque morceau du temps. Pour cela, éditons le fichier crontab :

crontab -e
Astuce: La commande crontab -e appelle l'éditeur vi par défaut. Si vous désirez utiliser un autre éditeur en lieu et place de celui-ci, modifiez la variable VISUAL ou EDITOR dans le fichier de configuration de votre shell avec le nom de l'éditeur souhaité:
export EDITOR=/usr/bin/nano

Maintenant que le fichier est ouvert dans notre éditeur favori, on peut y ajouter les lignes suivantes :

#min hour day Month Day_Of_Week Command
0    *    *   *     *           bash /opt/monScript.sh

Après ça, il suffit d'enregistrer les modifications et de fermer l'éditeur pour que cron prenne en charge la nouvelle tâche. Ce que nous avons demandé, c'est que le script /opt/monScript.sh s'exécute pour n'importe quelle valeur d'heure (1..24), de jour (1..365), de mois (1..12), de jour de la semaine (lundi..dimanche) du moment que la valeur des minutes soit de 0 (11h00, 12h00, ...).

On aurait également pu préciser */2 pour avoir toutes les valeurs paires.

En ce qui concerne la commande, le choix a été fait ici d'exécuter un script. On aurait tout aussi bien pu exécuter la commande directement ici. D'un point de vue personnel, je préfère garder le script séparé pour pouvoir l'exécuter à la main si nécessaire.

Format du fichier crontab

Le format standard d'une ligne pour crontab est la suivante (chaque champ étant séparé par un espace) :

<minute> <heure> <jour du mois> <mois> <jour de la semaine> <utilisateur> <commande>

Les valeurs possibles sont:

  • <minute>: de 0 à 59
  • <heure>: de 1 à 23
  • <jour du mois>: de 1 à 31
  • <mois>: de 1 à 12
  • <jour de la semaine>: de 0 à 7 (0 et 7 désignant le dimanche)
  • <utilisateur>: ce champ est réservé aux fichiers placés dans /etc/crond.d/, on va donc l'omettre lors de l'édition par crontab -e
  • <commande>: la commande ou le script à exécuter

Des caractères particuliers peuvent être employés pour chacun des 5 premiers champs:

  • , : permet de spécifier une liste de valeurs.
  • - : permet de spécifier une plage de valeur.
  • / : permet de spécifier une répétition.
  • * : désigne toutes les valeurs possibles.

Par exemple, la tâche suivante s'exécutera toutes les 5 minutes entre 9 et 17 h (17 h non inclu), chaque semaine, sauf les samedis et dimanche, de janvier à mai et de septembre à décembre:

*/5 9-16 * 1-5,9-12 1-5 /home/user/bin/i_love_cron.sh
Astuce: Il existe des interfaces graphiques rendant la planification de tâches plus lisible, comme kdeadmin-kcron, si vous utilisez KDE.

En outre, il existe des valeurs prédéfinies qui peuvent remplacer les 5 premiers champs:

  • @yearly (ou @annually): une fois par an (au premier janvier)
  • @monthly: une fois par mois (premier du mois à minuit)
  • @weekly: une fois par semaine (dimanche, minuit)
  • @daily : une fois par jour (minuit)
  • @hourly : chaque heure
  • @reboot : au prochain démarrage de la machine.

Tâches asynchrones

Pour les tâches système mensuelles, hebdomadaires et quotidiennes des répertoires /etc/cron.*, cronie, par l'intermédiaire d'anacron, fait en sorte que si la machine est éteinte à l'heure de l'exécution, la tâche est exécutée au cours du démarrage suivant (le délai, entre autres choses, pouvant être réglé dans /etc/anacrontab). Il suffit donc d'ajouter le script désiré au niveau de /etc/cron.daily, /etc/cron.weekly ou /etc/cron.monthly comme indiqué précédemment.

Attention: Les tâches prévues à la minute ou à l'heure près ne sont concernées: l'unité d'anacron étant la journée.

En revanche, cronie ne fournit pas de mécanismes aux utilisateurs pour faire de même. Donc, soit ils devront contourner le problème en prévoyant des plages suffisamment larges dans leur planification, soit il faudra passer à dcron (déconseillé à l'heure actuelle cependant, car les développeurs de dcron n'ont plus le temps de corriger des bugs, d'où son retrait du groupe base), fcron, anacron (via l'utilitaire anacrontab dont le fonctionnement est similaire à crontab).

Lancement d'application graphique

Il vous faudra au moins faire précéder votre commande de (ou l'inclure dans votre script):

export DISPLAY=:0 ;

(à adapter si vous avez différents affichages sous X)

Exemples

Préparation des mises à jour de pacman

Un exemple simple d'utilisation de cron est de l'utiliser pour télécharger les mises à jour de pacman de manière automatique. Commençons par cibler précisément ce que nous allons faire :

  1. Mettre à jour la base de données (-y)
  2. Télécharger et installer les mises à jour (-u)
  3. Télécharger les paquets à mettre à jour (-uw)


Pour le point 1, c'est un pré-requis. Si l'on ne met pas à jour la base de données, on ne peut rien faire de bien avec pacman. Pour le point 2, on pourrait penser que mettre à jour le système est une bonne idée mais c'est à l'administrateur de la machine de vérifier, à chaque mise à jour, ce qui se passe, cela ne devrait jamais être automatique. On en arrive donc on point 3 où l'on télécharge les paquets qui doivent être mis à jour. Partant de là, quand on voudra mettre à jour le système, les paquets seront déjà présents dans le cache et l'on n'aura plus qu'à les installer avec un « pacman -Syu ». Cela nous fait gagner du temps, mais dans un même temps, on a toujours la pleine maîtrise de ce que l'on installe ou non sur sa machine. Donc, an final, on a les paramètres -yuw.

Créons donc maintenant notre script /tmp/pacman.sh :

#!/bin/sh
# mise à jour journalière de la base de donnée et du cache de pacman
if [ -x /usr/bin/pacman ]; then
   /usr/bin/pacman -Syuw --noprogressbar --noconfirm
fi

Où le placer maintenant ? Vu que l'on veut l'exécuter tous les jours, on pourrait le placer dans cron.daily. Oui, ça fonctionnerait. Mais on n'aurait aucune certitude sur l'heure à laquelle il serait lancé, et ça pourrait tomber justement à un moment où l'on aurait besoin de la bande passante pour autre chose, ce qui pourrait être gênant. Précisons donc l'heure où l'on veut que ce soit effectué en choisissant un moment où la probabilité que le OC soit allumé, mais peu utilisé, soit grande. Pour l'exemple, prenons le temps de midi. Quoi de mieux que de faire travailler pacman sur la mise à jour de votre système à l'heure où vous-même faite la mise à jour de votre estomac ! :D

#mv /tmp/pacman.sh /etc/cron.d/pacman.sh
#chmod +x /etc/cron.d/pacman.sh
#crontab -e

On arrive dans la liste des tâches, comme précédemment, à laquelle on ajoute notre tâche :

...
# SYSTEM DAILY/WEEKLY/... FOLDERS
@hourly         ID=sys-hourly   /usr/sbin/run-cron /etc/cron.hourly
@daily          ID=sys-daily    /usr/sbin/run-cron /etc/cron.daily
@weekly         ID=sys-weekly   /usr/sbin/run-cron /etc/cron.weekly
@monthly        ID=sys-monthly  /usr/sbin/run-cron /etc/cron.monthly

#min hour day Month Day_Of_Week Command
30   12   *   *     *           /etc/cron.d/pacman.sh

Et voilà. On sauvegarde et on ferme l'éditeur et à partir de là, tous les jours à midi et demi, cron lancera pacman pour télécharger les mises à jour. Libre à nous de les installer une fois le ventre plein ou plus tard dans la journée ou même seulement le lendemain.

Archivage des logs

Si vous utilisez syslog-ng pour les journaux système, installer logrotate (dépendance optionnelle de cron) vous permettra d'effectuer automatiquement une rotation des logs, ce qui peut s'avérer utile pour les éplucher ou les récupérer tranquillement.

pacman -S logrotate
Note: Vous pouvez obtenir la même chose avec syslog-ng/logrotate ou sans. Cf. journalisation sous Systemd.

Il suffit ensuite de lancer le service cron.

Le fichier de configuration principal est /etc/logrotate.conf. Par défaut, logrotate agrège progressivement tous les logs donnés durant une semaine dans un même fichier (préfixé par log.1, log.2, etc.), et les conserve durant 4 semaines.

Note: Le log de pacman, /var/log/pacman.log, n'est pas concerné par les rotations: il est censé recueillir toutes les informations depuis la mise en place d'Arch sur votre machine, ce qui peut vous sauver la mise pour le cas où la base de données de pacman devrait être reconstruite.
Outils personnels
Autres langues