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édentesRévision précédente
Prochaine révision
Révision précédente
cron [Le 06/11/2023, 14:08] – [Commandes pour gérer les tâches planifiées Cron] 194.214.165.66cron [Le 07/01/2026, 14:05] (Version actuelle) – [Choix de l'utilisateur Cron] 141.227.26.230
Ligne 6: Ligne 6:
  
 ===== Qu'est-ce que 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 +**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 ».
  
Ligne 14: Ligne 15:
 [[Anacron]] est plutôt utilisé pour des machines à fonctionnement discontinu (comme les PC). [[Anacron]] est plutôt utilisé pour des machines à fonctionnement discontinu (comme les PC).
  
-En effetcron lance une tâche à un moment pré-déterminé (« le 14 janvier 2018 à 15h 30 »). 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.+Cron a plus d'options qu'Anacron. Comme ce dernieril 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. 
 + 
 +[[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 ces derniers sont peu nombreux. Avec Cron, des allumages PC trop intermittents risquent d'annuler une grande partie des traitements programmés. 
 + 
 +La syntaxe de Cron est plus complexe que celle d'Anacron. 
 + 
 +===== Choix de l'utilisateur Cron  ===== 
 +Il est important de définir clairement sous quel compte utilisateur est lancé **cron**. Ce peut-être vous (votre //user//), ou ce peut-être //root// (utilisateur qui a tous les droits). 
 + 
 +Pour des opérations demandant normalement un mot de passe, il faudra utiliser **cron //root//**. En effet, l'utilisateur //root// peut **tout** faire sans mot de passe. **__/!\__ Soyez prudents avec ces scripts, ils peuvent tout faire, y compris casser votre système !!** 
 + 
 +Pour des opérations en espace utilisateur (dans votre /home/), donc sans mot de passe, utilisez le **cron** de votre compte utilisateur. 
 + 
 +Pour lancer le **cron //root//** : **sudo crontab -e**. Pour consulter ce cron sans l'ouvrir : **sudo contrab -l**
  
-[[Anacron]] utilise au contraire des indications de temps relatives (« une fois par jour / par semaine / par mois »). 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.+Pour lancer le cron de votre espace utilisateur : **crontab -e**Pour consulter ce cron sans l'ouvrir : **contrab -l**
  
 ===== Comment fonctionne Cron  ===== ===== 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/\\
-Pour modifier vos tâches planifiées tapez : **crontab -e** (lance un éditeur du fichier crontab)\\ +Pour modifier vos tâches planifiées tapez : **crontab -e** ou **sudo crontab -e** (lance un éditeur du fichier crontab)\\
-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 champ qu'on ne souhaite pas renseigner doit être rempli avec une *) :+Voici une courte description de la structure d'une entrée dans un fichier crontab. Les champs à renseigner sont __dans l'ordre__ 
  
-    * //minute// (les minutes se numérotent de 0 à 59) +    * //minute// de lancement (les minutes se numérotent de 0 à 59) 
-    * //heure// (les heures se numérotent de 0 à 23) +    * //heure// de lancement (les heures se numérotent de 0 à 23) 
-    * //jours dans le mois// (les jours se numérotes de 1 à 31) +    * //jours dans le mois// de lancement (les jours se numérotes de 1 à 31) 
-    * //mois// (les mois se numérotent de 1 à 12, ou s'énoncent par leur libellé abrégé anglais - jan ; feb ; mar ; apr ; ...) +    * //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// (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)+    * //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.
 +Un champ contenant une étoile ** * ** signifie '**tous**' => dans le champs 'mois', ** * ** signifie donc : 'a lancer chaque mois') :
  
 Récapitulatif des 5 premiers champs : Récapitulatif des 5 premiers champs :
Ligne 69: Ligne 86:
     * @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 80: Ligne 109:
 https://crontab-generator.org https://crontab-generator.org
 http://www.cronmaker.com http://www.cronmaker.com
 +
 ===== Commandes pour gérer les tâches planifiées Cron ===== ===== Commandes pour gérer les tâches planifiées Cron =====
  
Ligne 89: Ligne 119:
  
 Pour modifier vos tâches planifiées tapez : Pour modifier vos tâches planifiées tapez :
- 
 <code bash>crontab -e</code> <code bash>crontab -e</code>
 +pour celles nécessitant normalement un mot de passe (qui dès lors ne sera pas demandé) :
 +<code bash>sudo crontab -e</code>
 et pour modifier celles d'un autre utilisateur : et pour modifier celles d'un autre utilisateur :
 <code bash>sudo crontab -e -u nom_utilisateur</code> <code bash>sudo crontab -e -u nom_utilisateur</code>
Ligne 96: Ligne 127:
 Quand vous sortez de l'éditeur, le nouveau fichier **crontab** sera installé. Le fichier est stocké dans ///var/spool/cron/crontabs/<user>// mais doit seulement être modifié par l'intermédiaire de la commande **crontab**. Quand vous sortez de l'éditeur, le nouveau fichier **crontab** sera installé. Le fichier est stocké dans ///var/spool/cron/crontabs/<user>// mais doit seulement être modifié par l'intermédiaire de la commande **crontab**.
  
-Note : sur xubuntu, il faut auparavant indiquer que l'utilisateur a le droit d'utiliser crontab. Pour cela il faut créer un fichier ///etc/cron.allow// et y saisir le nom des utilisateurs autorisés à utiliser crontab.+<note important>Il faut auparavant indiquer que l'utilisateur a le droit d'utiliser crontab.\\ 
 +Pour cela il faut créer un fichier **///etc/cron.allow//** et y saisir le nom des utilisateurs autorisés à utiliser crontab.</note>
  
 L'éditeur utilisé pour modifier la crontab peut être modifié par la commande : L'éditeur utilisé pour modifier la crontab peut être modifié par la commande :
Ligne 108: Ligne 140:
  
 Certains environnements de bureau, comme KDE dans sa « Configuration du système », offrent une interface graphique pour gérer les tâches cron. Certains environnements de bureau, comme KDE dans sa « Configuration du système », offrent une interface graphique pour gérer les tâches cron.
- 
- 
  
 ===== Lancement graphique ===== ===== Lancement graphique =====
Ligne 123: Ligne 153:
  
 ===== Chemin des scripts, commandes à exécuter ou fichiers à utiliser ===== ===== Chemin des scripts, commandes à exécuter ou fichiers à utiliser =====
-Cron n'a pas de PATH par défaut. Il est donc __grandement conseillé__ de mettre le chemin absolu vers les exécutables et fichiers. Exemple : +Une tâche cron est exécutée dans un shell non connecté (non-login) et non interactif. Les variables d'environnement habituelles et en particulier **PATH** ne sont pas connues. Cron n'donc pas de PATH par défaut.
-<code> +
-#!/bin/bash+
  
-export LANG="fr_BE.UTF-8"+Il faut donc :\\ 
 +- soit mettre les emplacements __complets__ des exécutables dans les commandes et les scripts appelés par cron, par exemple : 
 +<code>/usr/bin/zenity --info --text="Toto va bien!"</code> 
 +- soit ajouter une ligne de PATH dans le fichier crontab, __avant__ les appels de scriptsCette ligne définie où il est très probable que se trouveront les programmes appelés : 
 +<code>PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin</code> 
 +Soit faire les deux si on est très prudent :).
  
-/usr/bin/zenity --info --text="Toto va bien.\nReviens manger à la maison\!"+Enfin, 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> 
 +* * * * * cd /home/mon-compte/wokspace/ && /home/mon-compte/miniconda3/bin/python3 mon_script.py
 </code> </code>
  
Ligne 137: Ligne 172:
  
 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).
- 
  
 ===== Utilisation du répertoire /etc/cron.d  ===== ===== Utilisation du répertoire /etc/cron.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+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/cron.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 :
Ligne 154: Ligne 188:
  
 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. 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 ==== 
-Une tâche cron est exécutée dans un shell non connecté (non-login) et non interactif. Les variables d'environnement habituelles et en particulier **PATH** ne sont pas connues. 
- 
-Il faut donc soit mettre les emplacements complets des exécutables dans les commandes et les scripts appelés par cron, soit définir PATH dans le fichier crontab : 
-<code> 
-PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 
-</code> 
-Il peut être utile d'identifier le chemin où se trouve votre exécutable, exemple avec python : 
-<code bash> 
-which python3 
-# peut par exemple retourner 
-/home/mon-compte/miniconda3/bin/python3 
-</code> 
- 
-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> 
-* * * * * cd /home/mon-compte/wokspace/ && /home/mon-compte/miniconda3/bin/python3 mon_script.py 
-</code> 
  
 ==== Tests ==== ==== Tests ====
Ligne 178: Ligne 193:
 Il est important de vérifier que vos travaux dans **cron** fonctionnent comme prévu. Une méthode pour faire un test est de paramétrer la tâche dans le **crontab** pour qu'elle s'exécute quelques minutes plus tard et contrôler le résultat, avant de mettre la synchronisation de cette tâche à la bonne heure. Vous pouvez également trouver utile d'envoyer les retours des commandes dans un fichier texte pour voir les succès ou les échecs, par exemple : Il est important de vérifier que vos travaux dans **cron** fonctionnent comme prévu. Une méthode pour faire un test est de paramétrer la tâche dans le **crontab** pour qu'elle s'exécute quelques minutes plus tard et contrôler le résultat, avant de mettre la synchronisation de cette tâche à la bonne heure. Vous pouvez également trouver utile d'envoyer les retours des commandes dans un fichier texte pour voir les succès ou les échecs, par exemple :
  
-<code>+<code bash>
 echo "Sauvegarde de nuit: $(date)" >>/tmp/mybackup.log echo "Sauvegarde de nuit: $(date)" >>/tmp/mybackup.log
 </code> </code>
Ligne 184: Ligne 199:
 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 bash>MAILTO="jean.dupont@example.com"</code> 
-**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]])+<note important>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]])</note>\\ 
 +Au contraire, si vous ne voulez pas envoyer d’emails, ajouter simplement comme 1ère ligne utile <code bash>MAILTO=""</code>
  
 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]]).