J'ai un script bash qui n'a pour tâche que d'exécuter un fichier jar.
sms.sh
java -jar /volume1/homes/jar/smssender.jar
À l'aide de mon Synology NAS, j'ai configuré une tâche.
Ajout de la commande pour exécuter le script bash. Ajout d'une sortie de journal.
Exécution de ma nouvelle tâche.
Vérification du journal pour voir l'erreur suivante:
/volume1/homes/jar/sms.sh: ligne 1: java: commande introuvable
Vérification de la version / installation de Java:
Vérification de l'exécution du script sh manuellement (fonctionne):
Quelqu'un avec ce même cas étrange? Des solutions / idées?
j'ai essayé
- Redémarrer mon NAS
- Désinstaller / installer le package Java8
mais aucun n'a fonctionné.
/whatever/path/to/java/is/java /volume1/homes/jar
(ce n'est pas spécifique à la synologie)Réponses:
Lorsque le planificateur de tâches Synology exécute le script,
sms.sh
le paramètre PATH est extrait du script/etc/crontab
. Qui ne contient pas le chemin Java.L'environnement shell de connexion par défaut est défini int
/etc/profile
. À la fin, il y a une section pour ajouter le chemin Java.Comme déjà indiqué dans les commentaires déjà donnés, la recherche d'un script de profil destiné à un shell interactif n'est pas suggérée. Vous pouvez imiter le comportement du
/etc/profile
script dans votresms.sh
script pour définir CLASSPATH PATH JAVA_HOME LANG.Les points soulevés concernant le codage en dur du chemin dans votre script et la portabilité réduite qui en résulte peuvent avoir une priorité pour les amoureux dans ce cas spécifique.
la source
Je ne connais pas
Synology
si fwiw ...Le script shell fonctionne lorsqu'il est exécuté sur la ligne de commande, car la session de connexion particulière a déjà chargé un ensemble de variables d'environnement (par exemple, lors de la connexion au
.profile/.bashrc
(x) script (s) dans le répertoire personnel, les sources et les différentes variables d'environnement spécifiques à java sont chargées -PATH, JAVA_HOME, CLASSPATH
, etc) qui permettentjava
et le script de s'exécuter sans problème.L'
Synology
erreur d' échec du travail indique que les variables d'environnement spécifiques à Java n'ont pas été chargées et que le travail / script ne peut donc pas être localiséjava
.En supposant
Synology
qu'il n'y ait pas de paramètre / indicateur de configuration qui stipule de pré-charger le profil d'une connexion, la solution `` facile '' serait d'éditer le script (sms.sh
) et de lui faire source le fichier de ressources approprié avant d'effectuer toute opération (par exemple, appelerjava
). Un exemple simple:REMARQUES :
root
par le nom de la connexion sous laquelle le script doit être exécuté (dans lesSynology
images d' exemple , il semble que vous ayez choisi l'root
utilisateur, d'où mes références d'exemple~root
)~root/.bashrc
par le chemin d'accès au profil de l'utilisateur afin de précharger les variables d'environnement nécessaires pour permettre au script de trouverjava
la source
.bashrc
cela ne change pas le fonctionnement des démons, n'est-ce pas?) rupture de production./etc/profile.d
plutôt que ce~/.bashrc
n'est pertinent..profile
, certaines utilisant.bash_profile
, d'autres utilisant/etc/profile.d
, certaines définissant des variables d'environnement à partir de PAM, etc.) . D'une manière ou d'une autre, vous faites quelque chose de non portable. Au moins hardcodingPATH=$PATH:/whatever/specific/location
est amendement à des paramètres, et son comportement est évident pour les lecteurs (qui ne pas à se soucier de savoir si elle va changer plus tard).