Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
cron [Le 30/11/2021, 13:29]
141.227.26.230 [Comment fonctionne Cron ?] précisions
cron [Le 03/03/2024, 12:57] (Version actuelle)
86.202.8.12 [Distinction avec Anacron] meilleure présentation
Ligne 5: Ligne 5:
 ====== Programmer des tâches avec CRON ====== ====== Programmer des tâches avec CRON ======
  
- +===== Qu'​est-ce que Cron  ===== 
- +**Cron** est un programme pour exécuter automatiquement des scripts, des commandes ou des logiciels à une date et une heure spécifiée précise, ou selon un cycle défini à l’avance
- +
- +
-===== Qu'​est-ce que Cron ===== +
-**Cron** est un programme pour exécuter automatiquement des scripts, des commandes ou des logiciels à une date et une heure spécifiée précise, ou selon un cycle défini à l’avance. \\+
 Chaque utilisateur a un fichier **crontab**,​ lui permettant d'​indiquer les actions à exécuter.\\ Chaque utilisateur a un fichier **crontab**,​ lui permettant d'​indiquer les actions à exécuter.\\
 Cron est parfois appelé « planificateur de tâches » ou « gestionnaire de tâches planifiées ». Cron est parfois appelé « planificateur de tâches » ou « gestionnaire de tâches planifiées ».
  
 +====Distinction avec Anacron====
 +Cron est plutôt utilisé pour des machines à fonctionnement permanent (comme les serveurs).\\
 +[[Anacron]] est plutôt utilisé pour des machines à fonctionnement discontinu (comme les PC).
  
 +Cron a plus d'​options qu'​Anacron. Comme ce dernier, il peut lancer une tâche à un intervalle déterminé : par exemple chaque 5e jour de la semaine, chaque heure, ou chaque mois. Contrairement à Anacron, il peut aussi lancer une tâche à un moment pré-déterminé (« le 14 janvier 2018 à 15h 30 »). Limite par rapport à Anacron : si la machine n'est pas allumée, la tâche n'est pas lancée, et ne le sera jamais, même après le re-démarrage. __Elle est perdue__. Les prochaines seront évidement lancées, si la machine est allumée.
  
-===== Comment fonctionne Cron =====+[[Anacron]] n'​utilise que des indications de temps relatives (« une fois par jour / par semaine / par mois »). Autre différence d'avec Cron, Si vous avez demandé une tâche toute les semaines, et que votre PC est démarré seulement au bout de 10 jours, Anacron constatera le retard, et lancera donc la tâche juste après le démarrage de votre PC. 
 + 
 +Les 2 logiciels peuvent être utilisés sur un PC régulièrement éteint, mais Anacron a le gros avantage de lancer tous les traitements en retard à chaque allumage du PC, même si ceux-ci sont peu nombreux. Avec Cron, des allumages PC trop intermittents risquent d'​annuler une grande partie des traitements programmés. 
 +===== Comment fonctionne Cron  =====
  
 Les tâches planifiées cron sont définies au niveau du système dans le fichier /​etc/​crontab et dans le dossier /​etc/​cron.d/​\\ Les tâches planifiées cron sont définies au niveau du système dans le fichier /​etc/​crontab et dans le dossier /​etc/​cron.d/​\\
Ligne 22: Ligne 25:
 Les tâches définies dans **crontab** sont par principe exécutées par //​[[root|root]]//​ (l'​utilisateur avec le maximum de droits), sans demande de mot de passe. Cela permet d'​exécuter potentiellement n'​importe quelle tâche système, d'où un certain risque : soyez prudent, et abstenez-vous si vous ne maitrisez pas bien ce que vous faite. Les tâches définies dans **crontab** sont par principe exécutées par //​[[root|root]]//​ (l'​utilisateur avec le maximum de droits), sans demande de mot de passe. Cela permet d'​exécuter potentiellement n'​importe quelle tâche système, d'où un certain risque : soyez prudent, et abstenez-vous si vous ne maitrisez pas bien ce que vous faite.
  
-Voici une courte description de la structure d'une entrée dans un fichier crontab. Les champs à renseigner sont __dans l'​ordre__ (un champs ​qu'on ne souhaite pas renseigner doit être remplis ​avec une *) : +Voici une courte description de la structure d'une entrée dans un fichier crontab. Les champs à renseigner sont __dans l'​ordre__ (un champ qu'on ne souhaite pas renseigner doit être rempli ​avec une *) : 
-    * //minute// (les minutes se numérotent de à 60+ 
-    * //heure// (les heures se numérotent de à 24+    * //​minute// ​de lancement ​(les minutes se numérotent de à 59
-    * //jours dans le mois// (les jours se numérotes de 1 à 31) +    * //​heure// ​de lancement ​(les heures se numérotent de à 23
-    * //mois// (les mois se numérotent de 1 à 12, ou s'​énoncent par leur libellé abrégé anglais - jan ; feb ; mar ; apr ; ...) +    * //jours dans le mois// ​de lancement ​(les jours se numérotes de 1 à 31) 
-    * //jour de la semaine// (les jours se numérotent de 1 (lundi) à 7 (dimanche), ou s'​énoncent par leur libellé abrégé anglais - sun ; mon ; tue ; wed ; thu ; fri ; sat)+    * //​mois// ​de lancement ​(les mois se numérotent de 1 à 12, ou s'​énoncent par leur libellé abrégé anglais - jan ; feb ; mar ; apr ; ...) 
 +    * //jour de la semaine// ​de lancement ​(les jours se numérotent de 1 (lundi) à 7 (dimanche), ou s'​énoncent par leur libellé abrégé anglais - sun ; mon ; tue ; wed ; thu ; fri ; sat)
     * La commande à lancer.     * La commande à lancer.
 +
 +Récapitulatif des 5 premiers champs :
 +| | 1er | 2nd | 3è | 4è | 5è |
 +| | * | * | * | * | *  |
 +| id | minute | heure | jour dans le mois | mois | jour de la semaine ​ |
 +| valeur | 0-59 | 0-23 | 1-31 | 1-12 ou jan, feb, mar… | 1-7 ou mon, tue, wed… |
  
 ---- ----
Ligne 35: Ligne 45:
 La "​tâche"​ (non définie ici) sera exécutée 0mn et 0H après le démarrage, le 13e jour du 1er mois (janvier) __ET__ tous les vendredis (5e J. de la semaine). La "​tâche"​ (non définie ici) sera exécutée 0mn et 0H après le démarrage, le 13e jour du 1er mois (janvier) __ET__ tous les vendredis (5e J. de la semaine).
  
----- L'​exemple ci-dessous exécutera ///​usr/​bin/​apt-get update// à 3:05 (5e minute de la 3e heure), chaque jour de chaque mois (les * dans "​jour",​ "​mois"​ et "jours de la semaine",​ avec les droits de l'​utilisateur **nomdutilisateur**.+---- L'​exemple ci-dessous exécutera ///​usr/​bin/​apt-get update// à 3:05 (5e minute de la 3e heure), chaque jour de chaque mois (les * dans "​jour",​ "​mois"​ et "jours de la semaine"​), avec les droits de l'​utilisateur **nomdutilisateur**.
 <​code>​ <​code>​
 5 3  * *  * nomdutilisateur /​usr/​bin/​apt-get update 5 3  * *  * nomdutilisateur /​usr/​bin/​apt-get update
Ligne 60: Ligne 70:
     * @midnight     * @midnight
     * @hourly     * @hourly
 +
 +Exemples de lancements de tâches :
 +
 +chaque demie-heure (***/30** est une instruction,​ pas deux)
 +<​code>​*/​30 * * * * commande</​code>​
 +
 +chaque heure, au début de l'​heure (0 minute au démarrage de l'​heure) :
 +<​code>​0 * * * * commande</​code>​
 +chaque heure, à la 30e minute de l'​heure :
 +<​code>​30 * * * * commande</​code>​
 +
 +chaque heure, mais uniquement entre 9h00 et 5h00
 +<​code>​0 9-5 * * * commande</​code>​
  
 Cf. aussi : Cf. aussi :
  
    man 5 crontab    man 5 crontab
- 
  
  
Ligne 73: Ligne 95:
 ===== Commandes pour gérer les tâches planifiées Cron ===== ===== Commandes pour gérer les tâches planifiées Cron =====
  
-Pour examiner les tâches planifiées de l'​utilisateur courant (le contenu de votre **crontab**,​ tapez :+Pour examiner les tâches planifiées de l'​utilisateur courant (le contenu de votre **crontab**), tapez :
  
 <code bash> <code bash>
Ligne 111: Ligne 133:
  
 ===== Caractères UTF8 ===== ===== Caractères UTF8 =====
-Si vous utilisez un script nécessitant des caractères tels que des accents, n'​oubliez pas d'​ajouter un export **LANG="​fr_FR.UTF-8"​** ou **LANG="​fr_BE.UTF-8"​** au début de ce script. ​+Si vous utilisez un script nécessitant des caractères tels que des accents, n'​oubliez pas d'​ajouter un export **LANG="​fr_FR.UTF-8"​** ou **LANG="​fr_BE.UTF-8"​** au début de ce script.
  
 ===== Chemin des scripts, commandes à exécuter ou fichiers à utiliser ===== ===== Chemin des scripts, commandes à exécuter ou fichiers à utiliser =====
Ligne 125: Ligne 147:
 ===== Utilisation des répertoires /​etc/​cron.hourly,​ daily, weekly, monthly ​ ===== ===== Utilisation des répertoires /​etc/​cron.hourly,​ daily, weekly, monthly ​ =====
  
-Si vous avez examiné le fichier /​etc/​crontab de votre système, vous avez remarqué qu'il contient des tâches pour exécuter toutes les heures, jours, semaines, mois les fichiers ​contenu ​dans les dossiers /​etc/​cron.hourly,​ daily, weekly, monthly.+Si vous avez examiné le fichier /​etc/​crontab de votre système, vous avez remarqué qu'il contient des tâches pour exécuter toutes les heures, jours, semaines, mois les fichiers ​contenus ​dans les dossiers /​etc/​cron.hourly,​ daily, weekly, monthly.
  
 Si vous avez besoin qu'un script soit exécuté toutes les heures au niveau du système (par root), il suffit donc de le placer dans le dossier /​etc/​cron.hourly et de le rendre exécutable. De même s'il s'agit d'une tâche quotidienne (daily), hebdomadaire (weekly) ou mensuelle (monthly). Si vous avez besoin qu'un script soit exécuté toutes les heures au niveau du système (par root), il suffit donc de le placer dans le dossier /​etc/​cron.hourly et de le rendre exécutable. De même s'il s'agit d'une tâche quotidienne (daily), hebdomadaire (weekly) ou mensuelle (monthly).
Ligne 133: Ligne 155:
 IL est possible d'​éditer des services à exécuter automatiquement en rajoutant un fichier du nom que l'on souhaite dans le répertoire /​etc/​crond.d IL est possible d'​éditer des services à exécuter automatiquement en rajoutant un fichier du nom que l'on souhaite dans le répertoire /​etc/​crond.d
  
-Attention contrairement aux lignes d'un fichier crontab, elles doivent préciser quel utilisateur (nom_utilisateur dans l'​exemple ci dessous) ​ exécute le script : +Attention contrairement aux lignes d'un fichier crontab, elles doivent préciser quel utilisateur (nom_utilisateur dans l'​exemple ci-dessous) ​ exécute le script :
 <​code>​* * * * * nom_utilisateur /bin/touch /​home/​me/​ding_dong</​code>​ <​code>​* * * * * nom_utilisateur /bin/touch /​home/​me/​ding_dong</​code>​
  
Ligne 142: Ligne 164:
 <​code>​sudo crontab -e</​code>​ <​code>​sudo crontab -e</​code>​
  
-Remarque : cette commande édite directement le fichier // /​var/​spool/​cron/​crontabs/​root// ​+Remarque : cette commande édite directement le fichier // /​var/​spool/​cron/​crontabs/​root//​
  
-Une autre façon de créer une tâche planifiée devant être exécutée par root et d'​ajouter une entrée au fichier /​etc/​crontab ou de créer un nouveau fichier dans /etc/cron.d (cf. point précédent) en précisant bien root comme nom d'​utilisateur.+Une autre façon de créer une tâche planifiée devant être exécutée par root est d'​ajouter une entrée au fichier /​etc/​crontab ou de créer un nouveau fichier dans /etc/cron.d (cf. point précédent) en précisant bien root comme nom d'​utilisateur.
  
 ==== Répertoires ==== ==== Répertoires ====
Ligne 153: Ligne 175:
 PATH=/​usr/​local/​sbin:/​usr/​local/​bin:/​sbin:/​bin:/​usr/​sbin:/​usr/​bin PATH=/​usr/​local/​sbin:/​usr/​local/​bin:/​sbin:/​bin:/​usr/​sbin:/​usr/​bin
 </​code>​ </​code>​
-Il peut être utile d'identifié ​le chemin où se trouve votre exécutable,​ exemple avec python :+Il peut être utile d'identifier ​le chemin où se trouve votre exécutable,​ exemple avec python :
 <code bash> <code bash>
 which python3 which python3
-# peut retourné ​par exemple+# peut par exemple ​retourner
 /​home/​mon-compte/​miniconda3/​bin/​python3 /​home/​mon-compte/​miniconda3/​bin/​python3
 </​code>​ </​code>​
  
-De même, si le programm ​(script) exécuté doit sauvegarder des fichiers, il peut être utile de précéder l'​exécution de votre script par un changement de répertoire :​+De même, si le programme ​(script) exécuté doit sauvegarder des fichiers, il peut être utile de précéder l'​exécution de votre script par un changement de répertoire :​
 <code bash> <code bash>
 * * * * * cd /​home/​mon-compte/​wokspace/​ && /​home/​mon-compte/​miniconda3/​bin/​python3 mon_script.py * * * * * cd /​home/​mon-compte/​wokspace/​ && /​home/​mon-compte/​miniconda3/​bin/​python3 mon_script.py
Ligne 175: Ligne 197:
 Une autre façon de contrôler la bonne exécution des tâches cron est d'​utiliser sa capacité à envoyer des courriels. Une autre façon de contrôler la bonne exécution des tâches cron est d'​utiliser sa capacité à envoyer des courriels.
 Pour cela il suffit de renseigner la variable MAILTO dans votre fichier crontab, exemple : Pour cela il suffit de renseigner la variable MAILTO dans votre fichier crontab, exemple :
-<​code>​MAILTO:jean.dupont@example.com</​code>​ +<​code>​MAILTO="jean.dupont@example.com"</​code>​ 
-**Attention**,​ pour que cela fonctionne il faut que votre machine soit capable d'​envoyer des courriels.+**Attention**,​ pour que cela fonctionne il faut que votre machine soit capable d'​envoyer des courriels. ​(voir par exemple : [[msmtp|MSMTP]] ou [[postfix_systeme_satellite|Système Satellite pour Postfix]], [[exim4-satellite|Système satellite pour exim4]])
  
 Pour plus d'​informations,​ lisez les pages du //man// pour **cron** et **crontab** (le //man// est détaillé sur [[:​tutoriel:​console_ligne_de_commande|les commandes basiques]]). ​ Pour plus d'​informations,​ lisez les pages du //man// pour **cron** et **crontab** (le //man// est détaillé sur [[:​tutoriel:​console_ligne_de_commande|les commandes basiques]]). ​
-Sur une machine qui n'est pas allumée en permanence**[[anacron|anacron]]** (installé par défaut) permet de s'​assurer que les taches cron sont bien exécutées en vérifiant à intervalles régulier si un tâche n'est pas en retard.+Sur une machine qui n'est pas allumée en permanence**[[anacron|anacron]]** (installé par défaut) permet de s'​assurer que les taches cron sont bien exécutées en vérifiant à intervalles régulier si une tâche n'est pas en retard.
  
  
 ==== Log ==== ==== Log ====
-Par défaut on retrouve des log de commandes CRON dans ///​var/​log/​syslog//​ mais ce n'est pas très pratique.\\+Par défaut on retrouve des logs de commandes CRON dans ///​var/​log/​syslog//​ mais ce n'est pas très pratique.\\
 Pour activer le log spécifique de CRON:\\ Pour activer le log spécifique de CRON:\\
 Éditer le fichier ///​etc/​rsyslog.d/​50-default.conf//​ qui est appelé par ///​etc/​rsyslog.conf//​ et décommenter la ligne Éditer le fichier ///​etc/​rsyslog.d/​50-default.conf//​ qui est appelé par ///​etc/​rsyslog.conf//​ et décommenter la ligne
Ligne 195: Ligne 217:
 sudo systemctl restart cron sudo systemctl restart cron
 </​code>​ </​code>​
-Il ne reste plus qu'à surveiller les log de CRON:+Il ne reste plus qu'à surveiller les logs de CRON:
 <code bash> <code bash>
 sudo tail -f /​var/​log/​cron.log sudo tail -f /​var/​log/​cron.log
 </​code>​ </​code>​
  
-et si vous voulez des tâches silencieuses ((https://​unix.stackexchange.com/​questions/​163352/​what-does-dev-null-21-mean-in-this-article-of-crontab-basics)),​ ajouter à la fin de vos ligne CRON <code bash> > /dev/null 2>&​1</​code>​ pour rediriger les messages ET les erreurs vers le « trou noir ».+et si vous voulez des tâches silencieuses ((https://​unix.stackexchange.com/​questions/​163352/​what-does-dev-null-21-mean-in-this-article-of-crontab-basics)),​ ajouter à la fin de vos lignes ​CRON <code bash> > /dev/null 2>&​1</​code>​ pour rediriger les messages ET les erreurs vers le « trou noir ».
 ===== Liens ===== ===== Liens =====
   * [[https://​help.ubuntu.com/​community/​CronHowto]] (EN)   * [[https://​help.ubuntu.com/​community/​CronHowto]] (EN)
  • cron.1638275349.txt.gz
  • Dernière modification: Le 30/11/2021, 13:29
  • par 141.227.26.230