Cron

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

Comment démarrer cron

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

% 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 dans /etc/

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 exécution avec la commande chmod +x) dans un ces dossiers. Vous pourrez automatiser son exécution 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'exécution des scripts placés dans ces répertoires:

% 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 exécute 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ée 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/

La syntaxe est la suivante :

mm hh jj MMM JJJ tâche > log

Dans cette syntaxe:

  • 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 être 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 * * * * echo "cette commande est exécutée toutes les heures passées d'une minute"
17 8 * * * echo "Cette commande est exécutée tous les jours à 08h17"
17 20 * * * echo "Cette commande est exécutée tous les jours à 20h17"
00 4 * * 0 echo "Cette commande est exécutée tous les dimanches à 4h00"
* 4 * * Sun echo "Celle ci aussi"
42 4 1 * * echo "Cette commande est exécutée tous les 1er du mois à 4h42"
01 * 19 07 * echo "Cette commande est exécutée toutes les heures passées d'une minute tous les 19 Juillet"

Vous pouvez aussi lister des champs de la forme 1,2,3 ce qui signifie 1 et 2 et 3 équivalent à 1-3

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

démarrera le script backup.sh à 11h59 le lundi, mardi, mercredi, jeudi et vendredi et est équivalent à:

59 11 * * 1-5 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.

* 12 10-16/2 * * root backup.sh

équivalent à:

* 12 10,12,14,16 * * root backup.sh

Pour lancer connection.test toutes les 15 minutes entre 9h et 17h:

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

Les listes peuvent être 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 ou des mois 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 connecter 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 connecté. crontab -r supprime toutes les entrées cron de l'utilisateur avec lequel vous êtes connecté.

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

ou

cmd > log.file
> toto.log écrase le fichier toto.log.
» toto.log ajouter à la fin de toto.log.

Dans les deux cas, si toto.log n'existe pas il sera créé.

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

cmd >> logfile 2>&1

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

Sources

Ce tutoriel n'est pas de moi:

http://www.malekal.com/cron.php

 
tutoriels/cron.txt · Dernière modification: 21.04.2008 01:20 par sploutch     Haut de page