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. Modérateur
    Bêête que je suis. L'erreur provenait tout simplement d'une mauvaise orthographe du nom du script dans mon cron.
    1. 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 )
    2. 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.