Cron
Par PlaceOweb le mardi, octobre 31 2006, 00:30 - Système - Lien permanent
Les taches planifiés (programmées) sous linux : CRON
Le manuel de cron. D'autre infos par Wikipédia au sujet de crontab.
################################################################################################# # champ valeurs autorisées ##minute 0-59 #heure 0-23 #jour du mois 1-31 #mois 1-12 (ou les noms) #jour de la semaine 0-7 (0 ou 7 est dim ou utilisez les noms) # # min heures jours mois jourdela_semaine de de 0 à 7 : # 0 = Dimanche # 1 = Lundi # 2 = Mardi # 3 = Mercredi # 4 = Jeudi # 5 = Vendredi # 6 = Samedi # 7 = Dimanche ################################################################################################
#minute hour day month dayofweek command # #minute . nombre entier entre 0 et 59 #hour . nombre entier entre 0 et 23 #day . nombre entier entre 1 et 31 (si le mois est spécifié, le jour doit être valide) #month . nombre entier entre 1 et 12 (ou abréviation du nom du mois) #dayofweek . nombre entier entre 0 et 7, 0 ou 7 représentant le dimanche (ou l'abréviation du jour de la semaine)
Attention, il me semble que l'on puisse affecter des variables à la volée dans le cron.
maDate=$(date +%d-%m-%Y-%H-%M)
59 23 * * * /monProgrammeDeSauvegarde.sh >$maDate.log 2>/dev/null
Par contre il semble impossible d'exécuter une commande tel que :
leResultat=`echo "Hello"`
59 23 * * * /monProgrammeDeSauvegarde.sh >`date +%Y-%m-%d`.log
La cause étant que certains caractères doivent êtres échappés : How can I execute `date` inside of a cron tab job? Selon le crontab manpage : will be executed by /bin/sh or by the shell specified in the SHELL variable of the cronfile. Percent-signs (%) in the command, unless escaped with backslash (\), will be changed into newline characters, and all data after the first % will be sent to the command as standard input.
Par exemple, ces commandes fonctionnent :
* * * * * touch /root/`date +\%F`.logA
* * * * * touch /root/$(date +\%F).logB
ou alors sans échappement, en passant pas une variable :
VAR_DATE=date +%Y%m%d_%H%M%S
* * * * * touch /root/$($VAR_DATE).logC
Pour recevoir par mail tous les résultats destinés aux sorties standard (1) et erreur (2), vous devez rajouter
MAILTO=monMail@monDomaine.com
Aussi un programme lancé en ligne de commande ou via CRON peut avoir des PATH différents et donc ne plus trouver les bons programmes à lancer, par exemple :
con iptables: command not found
#* * * * * echo "PATH:$PATH"
# en ligne de commande : /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# depuis le CRON : /usr/bin:/bin
Bien que Esa Turtiainen en parle dans son article PATH Mini-HowTo :
cron est lancé par les scripts de démarrage mais il change son PATH en une valeur assez étrange : /usr/bin:/binn:/sbin:/bin:/usr/sbin:/usr/bin IL S'AGIT SUREMENT D'UN BOGUE DANS CRON. Il s'agit en fait du PATH de init (/usr/bin:/bin) qui est copié ici, mais sans le 0 terminal (chaîne en convention C - NdT)! Ce bogue n'existe pas sur tous les systèmes. Dans la crontab, on peut définir un PATH spécifique pour l'exécution des commandes. Pour la Debian 1.3, il s'agit de : PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin De cette façon, le PATH de crond n'est jamais utilisé dans les programmes utilisateurs. Tous les scripts de /etc/cron.* obtiennent par défaut le PATH de la crontab. Celui ci est utilisé même si le programme n'est pas exécuté en tant que root.
La seule alternative semble de définir les PATH dont vous avez besoin :
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin