Synology Scheduler .sh Java-Befehl nicht gefunden


9

Ich habe ein Bash-Skript, dessen einzige Aufgabe darin besteht, eine JAR-Datei auszuführen.

sms.sh

java -jar /volume1/homes/jar/smssender.jar

Mit meinem Synology NAS habe ich eine Aufgabe eingerichtet.

Task-Setup wird von root ausgeführt

Hinzufügen des Befehls zum Ausführen des Bash-Skripts. Protokollausgabe hinzufügen.

Geben Sie hier die Bildbeschreibung ein

Meine neue Aufgabe ausführen.

Geben Sie hier die Bildbeschreibung ein

Überprüfen Sie das Protokoll auf folgenden Fehler:

/volume1/homes/jar/sms.sh: Zeile 1: Java: Befehl nicht gefunden

Überprüfen der Java-Version / Installation:

Geben Sie hier die Bildbeschreibung ein

Manuelles Überprüfen der Ausführung des sh-Skripts (funktioniert):

Geben Sie hier die Bildbeschreibung ein

Jemand mit dem gleichen seltsamen Fall? Problemumgehungen / Ideen?

Ich habe es versucht

  • Neustart meines NAS
  • Java8-Paket deinstallieren / installieren

aber keiner hat funktioniert.


4
In Anbetracht Ihres Problems liegt wahrscheinlich ein Problem mit einer Umgebung (JAVA_HOME, PATH) vor, die bei der Ausführung des Jobs nicht richtig festgelegt wurde. Sie sollten entweder den absoluten Pfad zur ausführbaren Java-Datei verwenden oder eine Datei als Quelle für Sie bereitstellen.
NoDataFound

@NoDataFound Was meinst du mit absolutem Pfad? Ist nicht /volume1/(...)/file.jar der Pfad? Vielen Dank für Hilfe und Zeit
Piguy

3
Suchen Sie zuerst die ausführbare Java-Datei. /whatever/path/to/java/is/java /volume1/homes/jarRufen Sie es dann mit (dies ist nicht spezifisch für die Synologie) auf
NoDataFound

1
Wir sollten hier wahrscheinlich hinzufügen, dass der Benutzer, mit dem der Befehl ausgeführt wird, wahrscheinlich nicht der Benutzer ist, mit dem sich OP anmeldet (es sei denn, er ist sich sicher, dass dies der Fall ist) und daher einen anderen Pfad hat.
BadZen

(Auch:
Ist

Antworten:


5

Wenn der Synology Task Scheduler das Skript ausführt, wird sms.shdie PATH-Einstellung aus dem Skript übernommen /etc/crontab. Welches nicht den Java-Pfad enthält.

Die Standard-Login-Shell-Umgebung ist int definiert /etc/profile. Am Ende befindet sich ein Abschnitt zum Hinzufügen des Java-Pfads.

PATH=$PATH:/var/packages/Java8/target/j2sdk-image/bin # Synology Java runtime enviroment
PATH=$PATH:/var/packages/Java8/target/j2sdk-image/jre/bin # Synology Java runtime enviroment
JAVA_HOME=/var/packages/Java8/target/j2sdk-image/jre # Synology Java runtime enviroment
CLASSPATH=.:/var/packages/Java8/target/j2sdk-image/jre/lib # Synology Java runtime enviroment
LANG=en_US.utf8 # Synology Java runtime enviroment
export CLASSPATH PATH JAVA_HOME LANG # Synology Java runtime enviroment

Wie bereits in bereits gegebenen Kommentaren erwähnt, wird die Beschaffung eines Profilskripts, das für eine interaktive Shell gedacht ist, nicht empfohlen. Sie können das Verhalten des /etc/profileSkripts in Ihrem sms.shSkript nachahmen , um CLASSPATH PATH JAVA_HOME LANG festzulegen.

Die angesprochenen Punkte zur Hardcodierung des Pfads in Ihrem Skript und die daraus resultierende verringerte Portabilität haben in diesem speziellen Fall möglicherweise einen Vorrang für Liebhaber.


Ihre Antwort hat mir sehr geholfen und ist richtig, aber ich habe auf meinem Telefon falsch geklickt und dem Benutzer in Down Under die 100 Punkte gegeben. Es tut mir wirklich leid
Piguy

@piguy Das ist live. ;-)
SubOptimal

-1

Ich bin nicht vertraut mit Synologyso fwiw ...

Das Shell-Skript funktioniert, wenn es über die Befehlszeile ausgeführt wird, da die jeweilige Anmeldesitzung bereits eine Reihe von Umgebungsvariablen geladen hat (z. B. wird beim Anmelden der .profile/.bashrcSkripte im Ausgangsverzeichnis eine Quelle gefunden und die verschiedenen Java-spezifischen Umgebungsvariablen werden geladen - PATH, JAVA_HOME, CLASSPATH, etc) die erlauben javaund das Skript ohne Probleme laufen lässt.

Der fehlgeschlagene SynologyJobfehler zeigt an, dass die Java-spezifischen Umgebungsvariablen nicht geladen wurden und der Job / das Skript daher nicht gefunden werden kann java.

Vorausgesetzt, es Synologygibt keine Konfigurationseinstellung / kein Konfigurationsflag, die das Vorladen des Anmeldeprofils vorschreibt, besteht die "einfache" Lösung darin, das Skript ( sms.sh) zu bearbeiten und die entsprechende Ressourcendatei zu erstellen, bevor Vorgänge ausgeführt werden (z java. B. Aufrufen ). Ein einfaches Beispiel:

$cat sms.sh
#!/usr/bin/bash

. ~root/.bashrc      # load the root account profile before continuing ...

java ...

ANMERKUNGEN :

  • Ersetzen Sie ihn rootdurch den Namen des Logins, unter dem das Skript ausgeführt werden soll (in den Beispielbildern Synologyscheinen Sie den rootBenutzer ausgewählt zu haben, daher meine Beispielreferenzen ~root).
  • Ersetzen Sie ihn ~root/.bashrcdurch den Pfad zum Benutzerprofil, um die Umgebungsvariablen vorzuladen, die zum Auffinden des Skripts erforderlich sindjava

Bitte empfehlen Sie nicht, Konfigurationsdateien, die für die interaktive Verwendung geschrieben wurden, in nicht interaktiven Kontexten zu verwenden. Dies führt dazu, dass Situationen, in denen die Benutzer Änderungen für harmlos halten (weil .bashrcsich die Funktionsweise von Daemons nicht ändert, oder?), Stattdessen dazu führen können Produktionsbruch.
Charles Duffy

1
Es ist viel besser, den tatsächlichen Speicherort zu finden und einfach ein geeignetes PATH-Update im Skript selbst oder in einer speziellen Konfigurationsdatei der Skriptquellen fest zu codieren. Das funktioniert auch in Situationen , in denen dies nicht - f / e, wenn /etc/profile.dnicht ~/.bashrcrelevant ist.
Charles Duffy

Hardcodierung ist kaum portierbar, insbesondere in Umgebungen mit gemischten Betriebssystemen / Versionen. Was die Verwendung interaktiver Konfigurations- / Ressourcendateien im Vergleich zu speziell erstellten Ressourcen- / Konfigurationsdateien betrifft, ist dies eher ein Problem der persönlichen Auswahl, das darauf beruht, dass die Entwickler die Umgebung schreiben / warten. Ich hatte in den letzten 20 Jahren keine / keine Probleme ... in Produktionsumgebungen ... mit einer gemeinsamen Ressourcen- / Konfigurationsdatei in einer gesamten Skriptumgebung, ymmv
markp-fuso

1
Das Punktieren in den interaktiven Dateien eines Benutzers ist auch nicht portierbar (insbesondere angesichts der Tatsache, dass Distributionen neu ausbalancieren, welcher Inhalt von welchen Dateien ausgeführt wird - einige tun Dinge auf herkömmliche Weise und verwenden .profile, einige verwenden .bash_profile, einige verwenden /etc/profile.d, einige setzen Umgebungsvariablen von PAM usw.) . Auf die eine oder andere Weise machst du etwas Unportables. Mindestens Hardcoding PATH=$PATH:/whatever/specific/locationwird auf einer Änderung der Einstellungen und ihr Verhalten ist offensichtlich an den Leser (die nicht zu befürchten müssen , ob es später ändern werden).
Charles Duffy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.