Cron
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"
* 4 * * Sun root echo "Celle ci aussi"
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