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.
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
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.
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:
Pour chaque unité de temps (minute/heure/…) les notations sont possibles:
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
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é.
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
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
Ce tutoriel n'est pas de moi: