Aller au contenu | Aller au menu | Aller à la recherche


Cron

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

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Fil des commentaires de ce billet