Problème crontab

Résolu
Bonjour à toutes et à tous,

J'ai une ligne dans mon crontab:

52 16 * * *  /home/johand/bin/shuffwall.sh > /home/johand/tmp/shuffwall.has_run


J'y ai placé des chemins coplètement spécifiés pour le débugage !
Le script:

#!/bin/sh
echo $0 |tee  /home/johand/tmp/NEWPATH

PATH=$PATH:/usr/bin
echo $PATH >> /home/johand/tmp/NEWPATH
WALL=${HOME}/Images/wallpapers
DEST=wallpaper

cd $WALL
[ -e $DEST ] && rm $DEST

ln -s $(ls -1 GNOME* | shuf -n 1) $DEST

Le problème
Le script fonctionne depuis la ligne de commande.
Le cron fonctionne car le fichier /home/johand/tmp/shuffwall.has_run est créé.
Par contre, ce dernier l est vide, malgré la présence de la ligne
echo $0 |tee /home/johand/tmp/NEWPATH

Le reste du script est à l'avenant , pas d'exécution.

Quelqu'un a-t-il déjà rencontré ce problème avec sa solution ?

Merci d'avance



--
Gates gave ^H sold you the windows.
GNU gave us the whole house.(Alexandrin)

3 réponses

  1. Contributeur
    Salut,

    Essaie de sourcer ton .bashrc (ou assimilé en fonction de ton shell), parce que je doute que les variables "$PATH" et "$HOME"soient connues de la crontab ;-((

    De même mets les chemin absolus pour tes commandes (/bin/rm, /bin/ln, etc.)
    1. Modérateur
      C'est bien pour cela que je modifie la variable PATH.
      Par contre
      36 19 * * * touch ${HOME}/tmp/mycrontab.works
      fonctionne. HOME est bien défini..

      Johan
    2. Contributeur
      C'est bien pour cela que je modifie la variable PATH.
      Tu la modifies certes, mais rien ne nous dit que "$PATH" est bien déclaré avant ;-(

      D'où ma proposition de sourcer ton environnement ;-)
    3. Bonjour,

      Je confirme : par sécurité, tout cronjob s'exécute dans un environnement quasi-vierge. Il faut déclarer explicitement toutes les variables d'environnement, soit dans le script, soit en sourçant son environnement.

      Notamment, tu lances la commande tee sans chemin absolu avant de déclarer le PATH.
  2. Modérateur
    J'ai ajouté une entrée cron
    10 13 * * *  env > /home/johand/tmp/crontab_env

    Ceci ne pose aucun problème:
    johand@osiris:~/tmp$ ls -l crontab_env ; cat crontab_env  
    -rw-r--r-- 1 johand johand 118 16 sep 13:10 crontab_env 
    LANGUAGE=fr_BE:fr 
    HOME=/home/johand 
    LOGNAME=johand 
    PATH=/usr/bin:/bin 
    LANG=fr_BE.UTF-8 
    SHELL=/bin/sh 
    PWD=/home/johand 
    


    Les utiltaires (en particulier env sont dans le PATH puisque
    johand@osiris:~/tmp$ which tee ln rm 
    /usr/bin/tee 
    /bin/ln 
    /bin/rm


    J'ai mis un PATH explicite dans maon script.
    PATH="/bin:/usr/bin"

    Conclusion:
    la redirection sur la ligne cron fonctionne (shuffwall.has_run)
    Si le script était exécuté, même les echo produiraienr une sortie dans ce fichier, or il est de taille nulle.

    Extrait de /va/log/syslog
     
    Sep 16 14:40:01 osiris /USR/SBIN/CRON[26479]: (johand) CMD ([26479] source /home/johand/bin/shuffwall.sh > /home/johand/tmp/shuffwall.has_run

    J'ai également essayé un sourcescript_name dans le cron afin d'être certain de récupérer l'environnement fourni par cron.
    Je me perds en conjectures...

    Gates gave ^H sold you the windows.
    GNU gave us the whole house.(Alexandrin)
    1. Non... comment je suis passé à côté de ça...

      Tes echo et ton tee écrivent dans /home/johand/tmp/NEWPATH
      Ton script n'écrit rien sur la sortie standard, donc c'est normal que /home/johand/tmp/shuffwall.has_run soit vide.

      Pour le problème d'exécution :
      1) Ajoute un set -x au début de ton script
      2) Redirige la sortie d'erreur dans un fichier ( 2>/tmp/stderr )
  3. Modérateur
    Bêête que je suis. L'erreur provenait tout simplement d'une mauvaise orthographe du nom du script dans mon cron.