tutorial sur l’utilisation de cron : plannificateur de tâches de GNU/Linux

Cron est un utilitaire commun à toutes distributions Linux et même à unix. Il permet l’execution de programmes / scripts à un temps ou une date spécifiée.

Comment démarrer cron

Cron est un daemon, ce qui signifie qu’il doit normalement être automatiquement démarré avec votre linux.
vous pouvez vérifier son execution 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 une distribution de type redhat, 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 : /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

Utilisation de cron par /etc/crond.daily /etc/crond.hourly /etc/crond.monthly

Dans votre dossier /etc/ vous trouvez :
cron.hourly/ cron.daily/  cron.weekly/ cron.monthly/

En plaçant un script (n’oubliez pas de lui attribuer les droits en execution avec la commande chmod +x) dans un ces dossiers. Vous pourrez automiser son execution respectivement une fois par heure, une fois par jour, une fois par semaine, une fois par mois.

/etc/crontab

En éditant le fichier /etc/crontab vous pouvez éditer le moment de l’execution des scripts placés dans ces répertoires :
malekalmorte@ubuntu:~$ cat /etc/crontab
# /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 executées les commandes des répertoires /etc/cron.hourly/ /etc/cron.daily/  /etc/cron.weekly/ /etc/cron.monthly/
La syntaxe est la suivante :

Dans cette syntaxe:

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

Exemple :

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"

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

ex:
* 12 16 * Mon root cmd
ou
* 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

ex :
59 11 * * 1,2,3,4,5 root backup.sh
démarrera le script backup.sh à 11h59 le lundi, mardi, mercredi, jeudi et vendredi
équivalent à :
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.

ex:
* 12 10-16/2 * * root backup.sh
équivalent à:
* 12 10,12,14,16 * * root backup.sh

*/15 9-17 * * * root connection.test

lance connection.test toutes les 15min entre 9h et 17h

Les listes peuvent etre combinées les unes avec les autres :
* 12 1-15,17,20-25 * * root cmd
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 10-16/2 * * root backup.sh
équivalent à :
* 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.

Les commentaires sont possibles sous cron avec # devant 🙂

Cron par utilisateur et commandes crontab

Chaque utilisateur peut avoir son cron, pour cela, il vous suffit de se logguer 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 remplacera 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é

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éficiez un seul >> le fichier  sera pas écrasé à chaque exécution vous garderez donc les logs depuis la première execution 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

Ce document a été inspiré depuis l’article de : http://www.unixgeeks.org/security/newbie/unix/cron-1.html

Comment lire d'autres tutoriels de malekal.com ?

Si le site vous a aidé, svp, débloquez les bloqueurs de publicités, n'hésitez pas non plus à partager l'article ou le site sur les réseaux sociaux.

Pour pouvoir lire plus d'articles et tutoriels, utilisez le menu en haut du site. Plein d'articles et tutos utiles vous attendent !

Besoin d'aide ?

Posez votre question ou soumettez votre problème sur le forum malekal.com pour obtenir une aide efficace : Aller sur le forum malekal.com
(Visited 4 550 times, 29 visits today)

3 thoughts on “tutorial sur l’utilisation de cron : plannificateur de tâches de GNU/Linux

  1. Bonjour,
    Je suis entrain de monter des serveurs pour de l’hébergement, et la seule chose qui me tracasse, c’est justement cron et crontab.
    En effet, je fais des tests pour sauvegarder mes bdd, mais cela ne fonctionne pas! Et il faut que cela fonctionne, car la sauvegarde des bdd des clients doit se faire tous les jours! j’ai écrit les fichiers backup_bdd.sh et clean_backups.sh, mais rien ne se passe sauf si je clique directement sur le fichier backup_bdd.sh, là il me fait la sauvegarde de la bdd désignée, mais il me la met à la racine du serveur et non pas dans le répertoire du client!
    Voilà, mes serveurs fonctionnent à merveilles, mais là, je plante…
    Alors, je suis ouvert à toutes solutions et/ou commentaires.

    Merci

  2. Bonjour,
    Je me permets de vous signaler une petite erreur (de traduction) dans votre tutorial :

    * 12 1-15,17,20-25 * * root cmd

    tous les lundi entre le 1er et le 15 devrait en fait être :
    tous les midis entre le 1er et le 15

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *