[CRON] problème d'exécution
RésoluJe 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
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.
-
c bon ça marche...
merci pour tout -
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) -
bon ben j'ai crié victoire trop vite !
le programme ne se lance pas ! -
ok, alors bon courage,
moi je pars en vacances -
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 -
ça marche !!!!!
merci
Par contre, il faut que je fasse autant de fichiers parx.csh que j'ai de répertoires à scruter ? -
Et bien voilà l'erreur !!!
dans la variable (à la fin), tu as
/opt/applications/opt/usrlib
au lieu de
/opt/applications/ki/usrlib -
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 -
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. -
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)-
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
-
-
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)-
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...
-
-
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
-
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 ... -
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 -
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 -
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.-
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 .... -
-
-
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 -
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 -
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 -
du coup j'ai répondu à la suite de ce lien :
http://www.commentcamarche.net/forum/affich-1487713-CRON-sous-Unix
- 1
- 2