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.
Hinzufügen des Befehls zum Ausführen des Bash-Skripts. Protokollausgabe hinzufügen.
Meine neue Aufgabe ausführen.
Ü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:
Manuelles Überprüfen der Ausführung des sh-Skripts (funktioniert):
Jemand mit dem gleichen seltsamen Fall? Problemumgehungen / Ideen?
Ich habe es versucht
- Neustart meines NAS
- Java8-Paket deinstallieren / installieren
aber keiner hat funktioniert.
/whatever/path/to/java/is/java /volume1/homes/jar
Rufen Sie es dann mit (dies ist nicht spezifisch für die Synologie) aufAntworten:
Wenn der Synology Task Scheduler das Skript ausführt, wird
sms.sh
die 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.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/profile
Skripts in Ihremsms.sh
Skript 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.
quelle
Ich bin nicht vertraut mit
Synology
so 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/.bashrc
Skripte im Ausgangsverzeichnis eine Quelle gefunden und die verschiedenen Java-spezifischen Umgebungsvariablen werden geladen -PATH, JAVA_HOME, CLASSPATH
, etc) die erlaubenjava
und das Skript ohne Probleme laufen lässt.Der fehlgeschlagene
Synology
Jobfehler zeigt an, dass die Java-spezifischen Umgebungsvariablen nicht geladen wurden und der Job / das Skript daher nicht gefunden werden kannjava
.Vorausgesetzt, es
Synology
gibt 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 (zjava
. B. Aufrufen ). Ein einfaches Beispiel:ANMERKUNGEN :
root
durch den Namen des Logins, unter dem das Skript ausgeführt werden soll (in den BeispielbildernSynology
scheinen Sie denroot
Benutzer ausgewählt zu haben, daher meine Beispielreferenzen~root
).~root/.bashrc
durch den Pfad zum Benutzerprofil, um die Umgebungsvariablen vorzuladen, die zum Auffinden des Skripts erforderlich sindjava
quelle
.bashrc
sich die Funktionsweise von Daemons nicht ändert, oder?), Stattdessen dazu führen können Produktionsbruch./etc/profile.d
nicht~/.bashrc
relevant ist..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 HardcodingPATH=$PATH:/whatever/specific/location
wird 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).