Cron : planifier l’exécution d’un programme, script sur Linux

Bloqueur de pub détectée - Vous bloquez l'affichage des publicités.
Pour soutenir le site, merci de bien vouloir laisser les publicités s'afficher
Plus d'informations : Comment désactiver les bloqueurs de publicité sur un site internet

Cron est un utilitaire commun à toutes distributions Linux et même à Unix. Il permet l’exécution de programmes, scripts à une date déterminée ou à une période.
Par exemple pour lancer une sauvegarde à une date ou fréquence précise.
C'est une sorte de tâche planifiée de Linux.

Cet article vous explique comment modifier et éditer un cron.
Quels sont les syntaxes de cron pour planifier l'exécution d'une tâche.
Enfin vous trouverez des exemples cron.

Cron : planifier une tâche sur Linux
Cron : planifier une tâche sur Linux

Cron : un daemon Linux

Cron est un daemon, ce qui signifie qu'il doit normalement être automatiquement démarré avec votre Linux.
Vous pouvez vérifier son exécution avec la commande :

malekalmorte@ubuntu:~$ ps -aux|grep cron
root      7928  0.0  0.1   1808   856 ?        Ss   11:30   0:00 /usr/sbin/cron
1000     16271  0.0  0.0   3432   600 pts/1    D+   21:33   0:00 grep cron

Sur la plupart des distributions Linux, vous pouvez redémarrer le service avec la commande :

service cron restart

Vous pouvez aussi régler cron pour qu'il soit activé au démarrage de l'ordinateur, avec la commande chkconfig :

chkconfig --level 234 cron on

Sur une distribution de type Debian, utilisez la commande :

systemctl restart cron

ou

/etc/init.d/cron restart


Enfin vous pouvez aussi activer cron au démarrage de votre Debian, avec la commande :

update-rc.d cron defaults

Modifier ou créer un cron

Il existe deux méthodes pour ajouter un cron :

  • En modifiant un des dossiers /etc/cron.*
  • avec la commande crontab -e qui édite le fichier cron de l'utilisateur stocké dans /var/spool/cron/crontabs/
  • Le fichier /etc/crontab stocke la configuration de cron.

Les fichiers de configuration dans /etc

Les fichiers de configuration cron se trouve dans /etc.
On en trouve plusieurs :

  • cron.hourly - les tâches planifiées chaque heure
  • cron.daily - exécution de tâches chaque jour
  • cron.weekly - chaque Week-End
  • cron.monthly - enfin tous les mois

En général, on y trouve les cron des applications installées.

Les fichiers cron dans /etc
Les fichiers cron dans /etc

Mais en plaçant un script dans un ces dossiers. Vous pouvez automatiser son exécution respectivement une fois par heure, une fois par jour, une fois par semaine, une fois par mois.

N'oubliez pas de lui attribuer les droits en exécution avec la commande chmod +x).[/warning]

Le contenu de /etc/crontab

En éditant le fichier /etc/crontab vous pouvez éditer le moment de l’exécution des scripts placés dans ces répertoires :

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file.
# This file also has a username field, that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# m h dom mon dow user  command
17 *    * * *   root    run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || run-parts --report /etc/cron.daily
47 6    * * 7   root    test -x /usr/sbin/anacron || run-parts --report /etc/cron.weekly
52 6    1 * *   root    test -x /usr/sbin/anacron || run-parts --report /etc/cron.monthly

SHELL est le shell dans lequel sera executé cron. Si ce dernier n'est pas spécifié, l'entrée de l'utilisateur sera prise par défaut dans le fichier /etc/passwd

PATH contient les répertoires dans où les programmes seront recherchés. Si par exemple vous avez un programme 'foo' dans le répertoire /usr/cog/bin/ si vous ne voulez pas à chaque fois devoir taper /usr/cog/bin/foo pour lancer le programme, vous devez ajouter le chemin /usr/cog/bin dans votre PATH.

MAILTO si une commande est lancée avec une sortie, un mail sera envoyé à cet utilisateur. Si aucun MAILTO n'est pas spécifiée, la sortie sera envoyée par mail au propriétaire de la commande qui a généré la sortie.

HOME est le répertoire home de cron. Si aucun n'est spécifiée, ce sera l'entrée de /etc/passwd qui sera prise.

La seconde partie décrit a quel moment seront exécutées les commandes des répertoires /etc/cron.hourly/ /etc/cron.daily/  /etc/cron.weekly/ /etc/cron.monthly/

Modifier un cron utilisateur

Chaque utilisateur peut avoir son cron, pour cela, il vous suffit de se loguer avec votre utilisateur et de taper la commande
crontab -e ce qui vous lancera votre éditeur de texte spécifié par la variable EDITOR ou VISUAL.
Pour modifier l'éditeur en via, il vous suffit de taper :

export EDITOR=vi

Au moment d'enregistrer et quitter l'éditeur, cron vérifiera la syntaxe, si cette dernière n'est pas correcte, il vous le signalera.

  • crontab nom_du_fichier - remplace l'entrée cron par celles contenues dans le fichier
  • crontab -l - liste les entrées cron de l'utilisateur avec lequel vous êtes logué
  • crontab -r - supprime toutes les entrées cron de l'utilisateur avec lequel vous êtes logué

Enfin l'utilisateur administrateur root peut modifier ou lister le cron d'un utilisateur avec le paramètre -u :

crontab -u malekalmorte -l
crontab -u malekalmorte -e

Le système d'exploitation stocke le cron utilisateur dans /var/spool/cron/crontabs/.
On trouve un dossier pour chaque utilisateur.

Le dossier cron /var/spool/cron/crontabs/ qui stocke le cron de chaque utilisateur

Syntaxe et exemples cron

La syntaxe de cron est la suivante :

mm hh jj MMM JJJ user commande
  • mm représente les minutes (de 0 à 59)
  • hh représente l'heure (de 0 à 23)
  • jj représente le numéro du jour du mois (de 1 à 31)
  • MMM représente le numéro du mois (de 1 à 12) ou l'abréviation du nom du mois (jan, feb, mar, apr, ...)
  • JJJ représente l'abréviation du nom du jour ou le chiffre correspondant au jour de la semaine (0 représente le dimanche, 1 représente le lundi, ...) ; NOTE : dimanche peut aussi etre représenté par le chiffre 7
  • tâche représente la commande ou le script shell à exécuter
  • log représente le nom d'un fichier dans lequel stocker le journal des opérations. Si la clause > log n'est pas spécifiée, cron enverra automatiquement un mail de confirmation. Pour éviter cela il suffit de spécifier > /dev/null

Pour chaque unité de temps (minute/heure/...) les notations sont possibles:

  • *: a chaque unité de temps
  • 2-5: les unités de temps (2,3,4,5)
  • */3: toutes les 3 unités de temps (0,3,6,...)
  • 5,8: les unités de temps 5 et 8

Exemples de cron

Voici plusieurs exemples afin de bien comprendra la syntaxe cron

01 * * * * root echo "cette commande est exécutée toutes les heures passées d'une minute"
17 8 * * * root echo "Cette commande est exécutée tous les jours à 08h17"
17 20 * * * root echo "Cette commande est exécutée tous les jours à 20h17"
00 4 * * 0 root echo "Cette commande est exécutée tous les dimanches à 4h00"
42 4 1 * * root echo "Cette commande est exécutée tous les 1er du mois à 4h42"
01 * 19 07 * root echo "Cette commande est exécutée toutes les heures passées d'une minute tous les 19 Juillet"

Mais vous pouvez aussi combiner deux cron pour, par exemple :
Pour lancer une commande tous les lundi 16 du mois à 12h00 vous pouvez spécifiez :

* 12 16 * Mon root cmd
* 12 16 * * root cmd
* 12 * * Mon root cmd

Vous pouvez aussi lister des champs de la forme 1,2,3 ce qui signifie 1 et 2 et 3 équivalent à 1-3.
Voici un autre exemple cron qui démarre le script backup.sh à 11h59 le lundi, mardi, mercredi, jeudi et vendredi.

59 11 * * 1,2,3,4,5 root backup.sh
59 11 * * 1-5 root backup.sh

Une valeur comme */2 dans les jours signifie que la commande sera lancée toutes les deux jours.
et */5 dans les heures signifie que la commande sera lancée toutes les 5 heures.
Exemples avec les équivalents :

* 12 10-16/2 * * root backup.sh
* 12 10,12,14,16 * * root backup.sh
*/15 9-17 * * * root connection.test

Ainsi les listes peuvent être combinées les unes avec les autres.
Cela lance la commande cmd tous les lundi entre le 1er et le 15 et entre le 20 et 25 du mois (inclus) et le 17 de tous les mois.

* 12 1-15,17,20-25 * * root cmd
* 12 10-16/2 * * root backup.sh
* 12 10,12,14,16 * * root backup.sh

L'utilisation des jours n'est pas case sensitive, vous devez spécifiez les 3 premières lettres, ex: Mon, sun or Mar, jul.

Enfin les commentaires sont possibles sous cron avec # devant 🙂

Rediriger la sortie cron

Comme nous l'avons vu les sorties cron vont par mail à l'utilisateur spécifié dans la variable MAILTO mais vous pouvez aussi supprimer ou rediriger les sorties.

Par exemple avec la syntaxe suivante, vous pouvez renvoyer un mail à l'utilisateur désiré

cmd | mail -s "Subject of mail" user

Vous pouvez rediriger la sortie (par exemple vers /dev/null si vous n'en voulez vraiment pas ) ou dans un fichier de log en utilisant la syntaxe suivante :

cmd >> log.file

Ceci redirige la sortie standard et non les erreurs, pour rediriger les erreurs, vous devez utiliser la syntaxe suivante :

cmd >> logfile 2>&1

Note : en spécifiant deux > cela recréé le fichier logfile à chaque exécution de la commande.
Si vous spécifiez un seul >> le fichier  sera pas écrasé à chaque exécution vous garderez donc les logs depuis la première exécution du fichier.

Vous pouvez aussi envoyer le fichier de log par mail en créant une nouvelle entrée cron, avec la syntaxe suivante :

mail -s "logfile for cmd" <log.file
Vous avez trouvé cet article utile et interressant, n'hésitez pas à le partager...

Trouver la solution sur le forum d'aide

Vous êtes arrivé au terme de l'article Cron : planifier l’exécution d’un programme, script sur Linux mais vous n'avez pas trouvé la solution à votre problème...
Suivez ces articles du forum pour trouver une réponse ou demandez à votre tour de l'aide sur le forum