Table des matières

,

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 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 ».

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.

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.

La syntaxe de cron est plus complexe que celle d'anacron.

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/
Pour modifier vos tâches planifiées tapez : crontab -e (lance un éditeur du fichier crontab)
Les tâches définies dans crontab sont par principe exécutées par 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 maîtrisez pas bien ce que vous faites.

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 *) :

Récapitulatif des 5 premiers champs :

1er 2nd
* * * * *
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…

Si jour du mois et mois sont définis, jour de la semaine n'est pas nécessaire. Cependant, si le champ est indiqué en plus, la commande sera exécutée à la date jour du mois et mois mais AUSSI tous les jour de la semaine définis. Exemple avec

0 0 13 1 5 tâche

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.

5 3  * *  * nomdutilisateur /usr/bin/apt-get update

—- Vous pouvez faire tourner cron toutes les 5 minutes, entre 9H à 17H, et uniquement du lundi au vendredi, avec un message "Où en es tu ?" (on met * pour les colonnes "jour dans le mois" et "mois", puisqu'on utilise pas ces données) :

*/5 9-17 * * mon,tue,wed,thu,fri wall "Où en es tu ?"

ou vous rappeler un anniversaire à 9h du matin le 10 janvier chaque année :

0 9 10 jan  * echo "C'est l'anniversaire de ta Maman aujourd'hui !" >>~/readme

Il existe des raccourcis intéressants :

Exemples de lancements de tâches :

chaque demie-heure (*/30 est une instruction, pas deux)

*/30 * * * * commande

chaque heure, au début de l'heure (0 minute au démarrage de l'heure) :

0 * * * * commande

chaque heure, à la 30e minute de l'heure :

30 * * * * commande

chaque heure, mais uniquement entre 9h00 et 5h00

0 9-5 * * * commande

Cf. aussi :

 man 5 crontab

Vous pouvez générer le code grâce à ces outils en ligne : https://crontab.guru https://crontab-generator.org http://www.cronmaker.com

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 :

crontab -l

Pour modifier vos tâches planifiées tapez :

crontab -e

et pour modifier celles d'un autre utilisateur :

sudo crontab -e -u nom_utilisateur

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.

L'éditeur utilisé pour modifier la crontab peut être modifié par la commande :

sudo update-alternatives --config editor

ou par un :

select-editor
Lors du premier accès à « crontab -e » un menu apparaît et donne le choix de l'éditeur à utiliser.

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

Par défaut, l'exécution de cron n'affiche rien. Si vous avez besoin de démarrer une interface graphique par exemple pour utiliser zenity, kdialog, dialog ou encore totem, vlc, … Il vous faudra ajouter un DISPLAY=:0 devant la commande lancée. Exemple :

*/5 * * * * DISPLAY=:0 zenity --info --text="Toto va bien"
Il est parfois nécessaire de faire "xhost +" dans un terminal pour autoriser l'accès à X

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.

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 :

#!/bin/bash

export LANG="fr_BE.UTF-8"

/usr/bin/zenity --info --text="Toto va bien.\nReviens manger à la maison\!"

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 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).

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

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 :

* * * * * nom_utilisateur /bin/touch /home/me/ding_dong

Autres Considérations

Les commandes ci-dessus sont stockées dans un fichier crontab appartenant à votre compte d'utilisateur et exécutées avec votre niveau des permissions. Si vous voulez exécuter, régulièrement, une commande exigeant un plus haut niveau de permission (root), vous devez utiliser le fichier crontab root (ou racine) :

sudo crontab -e

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 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 :

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

Il peut être utile d'identifier le chemin où se trouve votre exécutable, exemple avec python :

which python3
# peut par exemple retourner
/home/mon-compte/miniconda3/bin/python3

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 :

* * * * * cd /home/mon-compte/wokspace/ && /home/mon-compte/miniconda3/bin/python3 mon_script.py

Tests

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 :

echo "Sauvegarde de nuit: $(date)" >>/tmp/mybackup.log

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 :

MAILTO="jean.dupont@example.com"

Attention, pour que cela fonctionne il faut que votre machine soit capable d'envoyer des courriels. (voir par exemple : MSMTP ou Système Satellite pour Postfix, Système satellite pour exim4)

Pour plus d'informations, lisez les pages du man pour cron et crontab (le man est détaillé sur les commandes basiques). Sur une machine qui n'est pas allumée en permanence, 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

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:
Éditer le fichier /etc/rsyslog.d/50-default.conf qui est appelé par /etc/rsyslog.conf et décommenter la ligne

cron.*                         /var/log/cron.log

Relancer rsyslog et cron

sudo systemctl restart rsyslog
sudo systemctl restart cron

Il ne reste plus qu'à surveiller les logs de CRON:

sudo tail -f /var/log/cron.log

et si vous voulez des tâches silencieuses 1), ajouter à la fin de vos lignes CRON

 > /dev/null 2>&1

pour rediriger les messages ET les erreurs vers le « trou noir ».

Liens


Contributeurs : Martigo, Les contributeurs d'Ubuntu-fr, l'entreprise Simplistay.