Erreur Bash via CRON

Bonjour à tous

Voilà le soucis:

Je cherche à lancer un script bash avec un cron, ce script marche parfaitement quand je le lance manuellement (./runFluid-efy.sh) mais lorsque je cherche à le lancer via un cron j’ai une erreur;
il ne parviens pas à lancer une des classes du script:

Ci dessous le script :slight_smile:

[code]#!/bin/sh

Directory of the script

PRG="$0"
while [ -h “$PRG” ]; do
ls=ls -ld "$PRG"
link=expr "$ls" : '.*-> \(.*\)$'
if expr “$link” : ‘./.’ > /dev/null; then
PRG="$link"
else
PRG=dirname "$PRG"/"$link"
fi
done
PRGDIR=dirname "$PRG"

PROG_HOME=cd "$PRGDIR/.." ; pwd

PROG_HOME=cd "$PRGDIR" ; pwd

#export JAVA_DIR=./jdk
export JAVA_DIR=$PROG_HOME/jdk

“$JAVA_DIR”/bin/java -Djavax.net.ssl.trustStore="$PROG_HOME/jssecacerts" -Djavax.net.ssl.trustStorePassword=changeit -jar Fluid-efy.jar

/usr/bin/java -Djavax.net.ssl.trustStore="$PROG_HOME/jssecacerts" -Djavax.net.ssl.trustStorePassword=changeit -cp Fluid-efy.jar:lib/groovy/* com.fluid_e.FXCEngine[/code]

Le cron:

[code]

m h dom mon dow command

#/4 * * * * /var/www/html/pim-community-standard/app/console akeneo:batch:j$
#
/2 * * * * /usr/bin/rename.sh
*/5 * * * * /opt/Fluid-efy/runFluid-efy.sh >> /bash.log 2>&1[/code]

Le script fait partie d’une solution “clef en main”, dans le zip qui m’était fourni, un Jdk était à décompresser…
Ce Jdk ne fonctionnait pas, j’ai donc du faire une install globale de Jdk (dans /usr/bin)et modifier dans le script la variable “#JAVA_DIR” de manière à pointer directement vers /usr/bin/java ).
Après cette modification, le script s’est bien lancé manuellement mais reste le problème de l’exécution de cette tache via le Cron.

Merci d’avance pour votre aide

Lorsque le script est lancé via cron c’est l’interpréteur /bin/sh du système qui interprète. Il semblerait que dans votre cas ce ne soit pas /bin/bash mais /bin/dash . Non, ce n’est pas un coup de Daesh :slight_smile:

Le début du script est bien emberlificoté.
Une solution possible serait de tout mettre dans une ligne avec quelque chose du genre

#!/bin/bash
JAVADIR=/opt/Fluidxxx/jdk /usr/bin/java -Djavax.net.zzzz=/opt/Fluidxxx/jss???.ts  -Djavax.net.ssl.trustStorePassword=changeit -cp Fluid-efy.jar:lib/groovy/* com.fluid_e.FXCEngine

C’est-à-dire en mettant des chemins absolus (il m’est impossible de copier/coller quelque chose de correct, la fenêtre de réponse n’est pas vraiment un éditeur ).

J’ai forcé l’interpréteur bash au cas où vous avez encore des velléités à faire des bashisms.

Cordialement,
Regards,
Mit freundlichen Grüßen,
مع تحياتي الخالصة

F. Petitjean
Ingénieur civil du Génie Maritime.

« Moi, lorsque je n’ai rien à dire, je veux qu’on le sache. » (R. Devos)

Merci pour ta réponse

J’ai modifié en conséquence pour tout mettre en chemin absolu mais ça ne change rien, il ne parviens toujours pas à charger la classe:

[code]
#!/bin/bash

/usr/bin/java -Djavax.net.ssl.trustStore=/opt/Fluid-efy/jssecacerts -Djavax.net.ssl.trustStorePassword=changeit -cp Fluid-efy.jar:lib/groovy/* com.fluid_e.FXCEngine[/code]

A quoi sert ce JAVADIR que tu as spécifié en premier ? Est ce simplement pour indiquer le chemin absolu vers l’exécutable java?

Le programme qui est lancé /usr/bin/java a un comportement qui n’est pas le même selon que la variable d’environnement JAVADIR est ou non renseignée.

Dans le script original

la variable est positionnée à une valeur correcte puisque vous dites que cela fonctionne en lançant le script directement.

Je vous avais proposé d’écrire un script en une seule ligne, et le préfixe

JAVA_DIR=/opt/truc/jdk

n’est pas là que pour faire joli. C’est une manière rapide d’enrichir l’environnement pour la commande qui suit sur la ligne de commande (et uniquement pour cette commande)

Explication : la commande env affiche une liste var=valeur pour les variables d’environnement rencontrées par env .

p2@debpacha:~$ env | fgrep JAVA
fp2@debpacha:~$ JAVADIR=/path/to/jdk env | fgrep JAVA
JAVADIR=/path/to/jdk
fp2@debpacha:~$ 

Bien sûr que tout mettre en chemins absolus ne change rien,
Par contre, si vous ne positionnez pas la variable $JAVADIR c’est tout à fait normal que la classe ne soit pas chargée.

fp2@debpacha:~$ env -i JAVADIR=/path/to/jdk JAVA_HOME=/path/to/casa env 
JAVADIR=/path/to/jdk
JAVA_HOME=/path/to/casa
fp2@debpacha:~$ env -i JAVADIR=/path/to/jdk JAVA_HOME=/path/to/casa PATH=$PATH env 
JAVADIR=/path/to/jdk
JAVA_HOME=/path/to/casa
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
fp2@debpacha:~$ which env
/usr/bin/env
fp2@debpacha:~$ 

Autrement dit : la syntaxe (en ligne)

VAR1=valeur1 VAR2=valeur2 /path/to/cmd options args

est un raccourci de la même ligne précédée par env

Cordialement,
Regards,
Mit freundlichen Grüßen,
مع تحياتي الخالصة

F. Petitjean
Ingénieur civil du Génie Maritime.

« L’arbre tombe toujours du côté où il penche. »
Proverbe français

En fait cette ligne:

n’as aucune incidence sur le script à partir du moment où je mets tout en chemin absolu et où je le lance manuellement.
Le répertoire jdk d’ailleurs est vide, il devait contenir l’install de jdk ( un zip était fourni mais ne fonctionnait pas).
J’ai donc simplement installé jdk de manière globale ( dans usr/bin).

Ce que que j’aimerai comprendre c’est vers quoi positionner la variable JAVA_DIR ??
Vers le répertoire où est installé jdk ? donc faire:

ca me donne le même résultat, classe impossible à charger…

Est-ce que tu n’aurais pas une variable LD_LIBRARY_PATH positionnée dans ta session shell ?
que donne :
$ env | grep LD_LIBRARY_PATH

la commande:

ne renvoie rien

Donc ces histoires de JAVA_DIR on oublie

J’ai tenté, en vain de vous expliquer que j’avais des difficultés avec le copier/coller dans votre premier message.
Comme c’est souvent me cas avec les logiciels en java, on arrive rapidement à des lignes de commandes à rallonge, et des chemins interminables.
Dans ces conditions, j’avais dès la première option -Djava.net. pris la permission de ne pas recopier le texte exact (j’ai un problème de basse vision ce qui n’arrange pas les choses).
Dans l’impossibilité de déchiffrer ces lignes de commandes ésotériques, j’avais donc simplifié en remplaçant ce que je ne pouvais pas retaper ou copier/coller par des xxxx ou zzz.

Dans le script original, vous insérez en début de ligne echo avec un espace après le echo et vous obtenez une magnifique ligne de commande avec des chemins absolus que vous coller dans un scrit shell appelé par cron.

Du temps de Boileau on n’écrivait pas de scripts.

Cordialement,
Regards,
Mit freundlichen Grüßen,
مع تحياتي الخالصة

F. Petitjean
Ingénieur civil du Génie Maritime.

« Avant donc que d’écrire, apprenez à penser »
Boileau De L’Art poétique (Chant I)