[CRON] problème d'exécution

Résolu
Bonjour,

Je suis en stage de fin d'études et je "découvre" Unix.
J'ai un petit problème pour lancer un programme automatiquement.
Dans mon cronfile : à 7h10 je lance un programme qui génère 2 fichiers (par.txt et par.log), à 7h20 j'envoie un mail avec par.txt comme corps du mail, à 7h25 j'envoie un mail avec par.log comme corps du mail.
Mon problème est que le programme n'est pas exécuté, mais je reçois les deux mails avec les résulats de la veille (que j'ai fait manuellement)

Voici un extrait de mon fichier cron :
10 07 * * 1,2,3,4,5 /export/home/kthmgr/crondir/paretolot 1 /var/opt/applications/mo/Report/sm3.0 
20 07 * * 1,2,3,4,5 /usr/ucb/mail -s 'Pareto des Wafers PC Gate sm3.0 du jour' sandra < /export/home/kthmgr/crondir/pareto.txt 
25 07 * * 1,2,3,4,5 /usr/ucb/mail -s 'Log pareto PC Gate sm3.0' sandra < /export/home/kthmgr/crondir/pareto.log 
30 07 * * 1,2,3,4,5 /export/home/kthmgr/crondir/paretolot 1 /var/opt/applications/mo/Report/sm2.5 


je le répète 7 fois.
J l'ai initialisé en faisant crontab cronfile (nom de mon fichier)

J'ai mis des traces et voici le résultat du fichier d'erreur :
ld.so.1: /export/home/kthmgr/crondir/paretolot: fatal: libKI_DEBUG.so: open failed: No such file or directory 


qu'est-ce que ça veut dire ?

Merci

22 réponses

Résumé de la discussion

Un souci de cron sous Unix empêche l’exécution d’un programme programmé chaque jour et fait que les mails envoyés à 7h20 et 7h25 contiennent les résultats de la veille. La cause fréquemment rencontrée est une librairie manquante ou un chemin d’environnement non chargé par cron, notamment lorsque le programme dépend d’un LD_LIBRARY_PATH ou d’un shell spécifique comme csh. Des conseils préconisent d’utiliser un wrapper shell ou d’invoquer explicitement le shell dans la cron, par exemple “csh /export/home/.../pareto_wl /var/opt/.../sm3.0”, et d’ajouter éventuellement un shebang. En pratique, l’utilisateur a finalement fait fonctionner le cron en lançant le fichier via csh et en évitant les variables d’environnement non chargées par cron.

Bobot (l’IA à votre service)
  1. et bien tu n'as plus qu'à remettre des traces
    maintenant ce doit être juste un petit pb avec le cron (date), car le shell est bon.

    dans le cron (exemple pour lancement toutes les 10 minutes) :
    0,10,20,30,40,50 * * * * commande > traces

    dans le shell :
    echo blabla > traces2
    echo blabla2 >> traces2
    echo blabla3 >> traces2

    première trace > (création du fichier)
    les suivantes >> (ajout à la fin du fichier)
    1. bon ben j'ai crié victoire trop vite !

      le programme ne se lance pas !
      1. je ne suis pas sûr d'avoir compris ta question.

        si ça répond à ta question,

        tu peux mettre autant de commandes que tu veux, à la suite, dans ton fichier parx.csh
        elles seront exécutées les unes après les autres.

        si tu veux des exécutions à des heures différentes,
        il faut un fichier pour chaque exécutition (appelé par le cron).
        on pourrait utiliser le même avec des paramètres,
        mais là, on repart sur une longue discussion
        1. t'as répondu à ma question qui n'était pas très claire...

          par contre, pour la réussite du shell, je vais attendre un peu avant de crier victoire...
          je vais le laisser tourner pendant 1 heure pour voir
      2. ça marche !!!!!

        merci

        Par contre, il faut que je fasse autant de fichiers parx.csh que j'ai de répertoires à scruter ?
        1. Et bien voilà l'erreur !!!

          dans la variable (à la fin), tu as
          /opt/applications/opt/usrlib
          au lieu de
          /opt/applications/ki/usrlib
          1. Résultat de "find /opt -name libKI_DEBUG.so -print" (car le résultat de l'autre est trop long...)

            find: cannot read dir /opt/lost+found: Permission denied
            /opt/applications/ki/usrlib/libKI_DEBUG.so
            find: cannot read dir /opt/applications/mo/Prober/saved/: Permission denied
            1. on est sur une fausse piste depuis le début alors.

              peux-tu faire :

              find / -name libKI_DEBUG.so -print

              tu auras sûrement des messages d'erreurs si tu n'es pas root, pour tous les répertoires où tu ne peux pas aller

              (sinon : find /opt -name libKI_DEBUG.so -print)

              il faut absolument savoir où se trouve cette librairie.
              1. on va mettre des traes :

                #!/usr/bin/csh

                setenv LD_LIBRARY_PATH "/usr/openwin/lib:/usr/openwin/lib/X11:/usr/lib:/lib:/opt/applications/ki/openint/shr:/opt/applications/ki/lib:/opt/applications/opt/usrlib"

                echo valeur de LD_LIBRARY_PATH
                echo $LD_LIBRARY_PATH

                echo lancement de la commande

                /export/home/kthmgr/crondir/paretolot 1 /var/opt/applications/mo/Report/sm3.0

                echo fin de la commande

                (supprimer : > /export/home/kthmgr/crondir/essai2.txt)
                1. Résultat :

                  Valeur de LD_LIBRARY_PATH
                  /usr/openwin/lib:/usr/openwin/lib/X11:/usr/lib:/lib:/opt/applications/ki/openint/shr:/opt/applications/ki/lib:/opt/applications/opt/usrlib
                  lancement commande
                  ld.so.1: /export/home/kthmgr/crondir/paretoe: fatal: libKI_DEBUG.so: open failed: No such file or directory
                  Killed
              2. pour la 1ère, ça ne peut pas marcher, 2 erreurs de syntaxe : le 1er $ est en trop et les "" sont mal placés ...

                pour la 2ème, tout doit être sur la même ligne (pas facile de le montrer avec le forum) :

                setenv LD_LIBRARY_PATH
                "/usr/openwin/lib:/usr/openwin/lib/X11:/usr/lib:/lib:/opt/applications/ki/openint/shr:/opt/applications/ki/lib:/opt/applications/ki/usrlib"

                et puis je ne sais pas si /bin/csh existe sur ta machine,
                si oui, il faut #!/bin/csh
                au début du shell (setenv est une commande spécifique "csh", ça ne marche que si le shell a trouvé /bin/csh ou /usr/bin/csh)
                1. J'ai fait ça dans le shell :
                  #!/usr/bin/csh
                  
                  
                  setenv LD_LIBRARY_PATH "/usr/openwin/lib:/usr/openwin/lib/X11:/usr/lib:/lib:/opt/applications/ki/openint/shr:/opt/applications/ki/lib:/opt/applications/opt/usrlib"
                  
                  /export/home/kthmgr/crondir/paretolot 1 /var/opt/applications/mo/Report/sm3.0 > /export/home/kthmgr/crondir/essai2.txt
                  


                  Quand je le lance manuellement, rien ne se passe... le programme n'est pas exécuté, pas de message d'erreur...
              3. J'ai essayé plusieurs trucs, ça ne marche pas plus....

                Avec ksh, ça marche manuellement mais pas dans le cron :
                #!/usr/bin/ksh
                
                
                echo Lancement du traitement
                echo Valeur de lib_path $LD_LIBRARY_PATH
                
                /export/home/kthmgr/crondir/paretolot 1 /var/opt/applications/mo/Report/sm3.0
                
                echo Fin du traitement


                Avec csh, ça marche pas trop (tests en manuel, pas dans le cron)...
                #!/usr/bin/csh
                
                setenv $LD_LIBRARY_PATH
                $LD_LIBRARY_PATH:"/usr/openwin/lib:/usr/openwin/lib/X11:/usr/lib:/lib:/opt/applications/ki/openint/shr:/opt/applications/ki/lib:/opt/applications/opt/usrlib"
                
                /export/home/kthmgr/crondir/paretolot 1 /var/opt/applications/mo/Report/sm3.0

                Message d'erreur : Variable syntax

                Avec ton autre solution :
                setenv LD_LIBRARY_PATH 
                "/usr/openwin/lib:/usr/openwin/lib/X11:/usr/lib:/lib:/opt/applications/ki/openint/shr:/opt/applications/ki/lib:/opt/applications/ki/usrlib"


                Message d'erreur :
                /usr/openwin/lib:/usr/openwin/lib/X11:/usr/lib:/lib:/opt/applications/ki/openint/shr:/opt/applications/ki/lib:/opt/applications/opt/usrlib: Command not found
                1. il faut donc rajouter setenv ... avant ta commande :

                  il faut trouver l'erreur de syntaxe dans le shell avec le setenv :
                  peut-être avec des " "

                  setenv LD_LIBRARY_PATH "/usr/openwin/lib:/usr/openwin/lib/X11:/usr/lib:/lib:/opt/applications/ki/openint/shr:/opt/applications/ki/lib:/opt/applications/ki/usrlib"

                  et tester encore et encore ...
                  1. pourtant, ça doit rester simple :

                    pour le cron, passes par le shell parsm5ap.csh :
                    ------------------------------------------------------
                    10 11 * * * /export/home/kthmgr/crondir/parsm5ap.csh >
                    /export/home/kthmgr/crondir/essai.txt

                    pour le shell parsm5ap.csh (droits +x) :
                    --------------------------------------------
                    #!/usr/bin/csh (ou #!/bin/csh si le fichier existe)
                    "ton programme" > /export/home/kthmgr/crondir/essai2.txt

                    dans essai.txt : les traces du shell (pour les erreurs de syntaxe par exemple)
                    dans essai2.txt : les traces de ton programme

                    ne te laisse pas impressionner par le message d'erreur Killed
                    1. J'ai retenté le shell dans le cron !

                      Résultat du message d'erreur :
                      ld.so.1: /export/home/kthmgr/crondir/paretoe: fatal: libKI_DEBUG.so: open failed: No such file or directory


                      Je crois que je ne pourrai pas m'en sortir de cette librairie !
                  2. il y a une erreur de syntaxe dans le shell apparament,
                    essayes le shell seul comme ça :

                    /export/home/kthmgr/crondir/parsm5ap.csh

                    je me suis peut-être planté dans la syntaxe du setenv
                    pour le shell,
                    tu peux essayer avec juste la commande (en supprimant la ligne setenv ...)

                    aussi,
                    ls /bin/csh
                    vérifies que ce fichier existe,
                    sinon,
                    #!/usr/bin/csh
                    1. le shell seul marche (avec les modifs) ....

                      je retente dans le cron
                  3. tout d'abord, désollé, je n'ai pas de machine pour tester,
                    sinon j'aurais essayé les commandes que je te propose.
                    (je fais de mémoire)

                    récap :
                    la variable qui te pose problème est positionnée en csh.
                    le cron fonctionne en sh, il faut donc passer par un csh,
                    soit directement par le cron.

                    d'autre part, un coup il y a paretolot, une autre fois pareto_wl,
                    donc réctifies le nom si je ne mets pas le bon.

                    Par le cron :
                    --------------
                    peut-être avec l'option -c

                    10 09 * * 1,2,3,4,5 /usr/bin/csh -c /export/home/kthmgr/crondir/paretolot 1 /var/opt/applications/mo/Report/sm3.0 2> /export/home/kthmgr/crondir/essai.txt

                    soit en passant par un csh :
                    -------------------------------
                    10 09 * * 1,2,3,4,5 /.../.../pareto.csh

                    le fichier pareto.csh (chmod +x) peut être :
                    #!/bin/csh

                    #positonnement de la variable d'environnement
                    #mais normalement il n'y a pas besoin de cette ligne
                    #================================
                    setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH:/opt/applications/ki/openint/shr:/opt/applications/ki/lib:/opt/applications/ki/usrlib

                    #ta commande (vérifier la syntaxe)
                    #======================
                    /export/home/kthmgr/crondir/paretolot 1 /var/opt/applications/mo/Report/sm3.0 2> /export/home/kthmgr/crondir/essai.txt

                    la première solution, je ne sais pas,
                    mais la deuxième soultion doit fonctionner.
                    1. Voici ce que j'ai fait :

                      Dans le cronfile :
                      40 10 * * 1,2,3,4,5	/export/home/kthmgr/crondir/parsm5ap.csh 2> /export/home/kthmgr/crondir/essai.txt


                      Dans le shell :
                      #!/bin/csh
                      setenv LD_LIBRARY_PATH
                      $LD_LIBRARY_PATH:/opt/applications/ki/openint/shr:/opt/applications/ki/lib:/opt/applications/opt/usrlib
                      
                      /export/home/kthmgr/crondir/paretoe 1 /var/opt/applications/mo/Report/sm5ap


                      Résultat du fichier d'erreur :
                      Variable syntax


                      Je vais essayer : /usr/bin/csh/ -c ....
                    2. A y est...

                      J'ai essayé : 10 09 * * 1,2,3,4,5 /usr/bin/csh -c /export/home/kthmgr/crondir/paretolot 1 /var/opt/applications/mo/Report/sm3.0 2> /export/home/kthmgr/crondir/essai.txt

                      Résultat : Killed

                      Là je crois que j'ai un gros souci...
                  4. je m'aperçois que je n'ai peut-être pas été clair :

                    dans le cronfile :

                    10 07 * * 1,2,3,4,5 /bin/csh /export/home/kthmgr/crondir/paretolot 1 /var/opt/applications/mo/Report/sm3.0
                    1. J'ai fait ça :
                      10 09 * * 1,2,3,4,5     /usr/bin/csh /export/home/kthmgr/crondir/paretolot 1 /var/opt/applications/mo/Report/sm3.0 2> /export/home/kthmgr/crondir/essai.txt


                      Résultat de fichier d'erreur :
                      Variable syntax
                      


                      Comprends pas...
                  5. dans le fichier cronfile :

                    plutôt :
                    /bin/csh /export/home/kthmgr/crondir/pareto_wl /var/opt/applications/mo/Report/sm3.0

                    fais attention aux paramètres, il manque peut-être un 1 :
                    /bin/csh /export/home/kthmgr/crondir/pareto_wl
                    1 /var/opt/applications/mo/Report/sm3.0

                    pour être sûr, tu fais :
                    which csh
                    si la réponse est /bin/csh, tu mets ça, sinon, tu mets le résultat

                    #!/bin/csh (ou autre) : tu le rajoutes uniquement dans tes shells, pas dans le cronfile
                    1. Attention, en csh, la syntaxe est différente :

                      #!/bin/csh

                      setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH:/opt/applications/ki/openint/shr:/opt/applications/ki/lib:/opt/applications/ki/usrlib

                      (ou source /.../.../.cshrc)

                      /export/home/kthmgr/crondir/pareto_wl /var/opt/applications/mo/Report/sm3.0

                      ou alors, tu repars de ton premier crontab, et tu rajoutes "csh" devant /export/home/kthmgr/crondir/pareto_wl
                      1. en faisant juste :

                        csh /export/home/kthmgr/crondir/pareto_wl /var/opt/applications/mo/Report/sm3.0

                        je rajoute #!/bin/csh au début ?
                    • 1
                    • 2