Java Programm per Script via Aufgabenplaner

Status
Für weitere Antworten geschlossen.

WasNdas?

Benutzer
Mitglied seit
26. Jun 2013
Beiträge
47
Punkte für Reaktionen
0
Punkte
6
Moin,

ich habe einen kleines Server Programm in Java geschrieben und möchte es auf meiner DS213j über den Aufgabenplaner starten. Das Programm funktioniert einwandfrei, wenn ich es aus der SSH Konsole als admin starte. Dazu rufe ich mein Skript aus dem Verzeichnis auf in dem auch die JAR-Datei ist die gestartet werden soll.
Rich (BBCode):
/bin/ash /volumen1/homes/admin/server/start_server.sh

Sobald ich das Skript aus einem anderen Verzeichnis heraus starte, erhalte ich die Meldung Error: Unable to access jarfile server.jar
Hier mein Shellskript:
Rich (BBCode):
#!/bin/sh
# cd /volume1/homes/admin/server/
$JAVA_HOME/bin/java -jar server.jar -cp /volume1/homes/admin/server/
Die zweite Zeile wollte ich dafür benutzen, das das Skript auch im richtigen Verzeichnis ausgeführt wird. Wenn ich sie aber auskommentiere, dann erhalte ich die Meldung line 2: can't cd to /volume1/homes/admin/server/

Da meine Shell bzw. Linux Kenntnisse wohl doch etwas in die Jahre gekommen sind, würde ich mich über Eure Unterstützung freuen.

Gruß
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
mal probiert den kompletten Pfad zum jar File anzugeben? Dann sollte es den cd imho eh nicht mehr brauchen
 

WasNdas?

Benutzer
Mitglied seit
26. Jun 2013
Beiträge
47
Punkte für Reaktionen
0
Punkte
6
Ja, das habe ich auch schon probiert aber dann kann das Programm die anderen (zur Laufzeit benötigten) Dateien nicht finden. Das könnte ich zur Not noch ändern aber ich frage mich trotzdem warum das cd nicht funktioniert. Im Terminal kann ich das ja auch... grübel, grübel...
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
kannst du denn im Script irgendeinen cd erfolgreich machen?
 

Merthos

Benutzer
Mitglied seit
01. Mai 2010
Beiträge
2.709
Punkte für Reaktionen
1
Punkte
84
Passt der Nutzer im Aufgabenplaner? Auf die homes hat ja nicht jeder Zugriff.
 

WasNdas?

Benutzer
Mitglied seit
26. Jun 2013
Beiträge
47
Punkte für Reaktionen
0
Punkte
6
Passt der Nutzer im Aufgabenplaner? Auf die homes hat ja nicht jeder Zugriff.
Ich habe den admin und root ausprobiert. MMn sollten beide auf das Verzeichnis /volume1/homes/admin zugreifen dürfen. Via ssh war ich auch als admin angemeldet und da geht es ja...
 

WasNdas?

Benutzer
Mitglied seit
26. Jun 2013
Beiträge
47
Punkte für Reaktionen
0
Punkte
6
Moin,

ich habe mein Server Programm so umgeschrieben, das es nun auch mit Linux klarkommt. Die System Properties bzw. die Environment Properties sind einfach zu unterschiedlich. Bislang lief mein Server nur auf Windows Maschinen...

So weit, so gut. Ich kann nun in der SSH Shell (als admin angemeldet) aus einem beliebigen Verzeichnis heraus mein Skript starten. Das mache ich so:
Rich (BBCode):
/bin/sh /volume1/homes/admin/server/start_server.sh
Wenn ich dieses Kommando genau so, bzw. auch ohne /bin/sh am Anfang, im Aufgabenplaner eingebe und auf Ausführen klicke, dann wird das Programm (vermeintlich) nicht gestartet. Ich kann es nicht per ps | grep java sehen und die Client Programme die sich zu dem Server verbinden wollen, erhalten keine Verbindung.

Ich habe auch schon die Kombination mit nohup ausprobiert (sowohl im Skript als auch beim Aufgabenplaner), damit das Programm weiterläuft. Aber das brachte leider auch nichts.

Jetzt bin ich mit meinem Latein am Ende. Hat jemand von Euch noch eine Idee?
 

WasNdas?

Benutzer
Mitglied seit
26. Jun 2013
Beiträge
47
Punkte für Reaktionen
0
Punkte
6
So, ich habe jetzt etwas weiter getestet, da ich immer noch keine Lösung habe.

So wie es aussieht, übernimmt das per Aufgabenplaner gestartete Skript nicht die Umgebungsvariablen auf die ich aus der SSH Shell heraus zugreifen kann. Okay, also benutze ich statt $JAVA_HOME den Pfad /volume1/@appstore/java7/jre. Allerdings bringt mich das nicht wirklich weiter, da mein Programm aus dem Aufgabenplaner immer noch nicht funktioniert. Ich habe hierzu Testausgaben (echo ~ > /volume1/homes/admin/server/aaa.txt) in mein Skript eingebaut (vor und nach dem Programmaufruf). Starte ich das Skript aus der SSH Shell heraus, dann erhalte ich in der Datei aaa.txt das gewünschte Ergebnis (/var/services/homes/admin). Beim Start aus dem Aufgabenplaner heraus, erhalte in nur ~ in der Datei.

Zusammenfassend hätte ich gerne folgende Fragen beantwortet:
- wie kann ich die Umgabungsvariablen (z.B. $JAVA_HOME) im Skript verfügbar machen?
- wie kann ich die Ausgaben von Shellskripten protokollieren, die vom Aufgabenplaner gestartet wurden?

Danke schon mal im voraus für Eure Antworten
 

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
12.310
Punkte für Reaktionen
2.869
Punkte
423
Denk dran, dass die Inhalte von /etc/profile und ~/.profile nur beim interaktiven Login durchlaufen werden. In vom Taskplaner aufgerufenen Scripts hat man daher eine andere Umgebung (PATH etc.) als beim interaktiven Aufruf. Wenn was davon für die Funktionsweise des Script wichtig ist, muss man diese Teile sicherheitshalber innerhalb des Scripts nochmal neu setzen (z.B. JAVA_HOME), dann funktioniert so ein Script sowohl interaktiv als auch per Taskplaner bzw. crond.

Um die Ausgaben zu loggen, musst du diese explizit in ein File umleiten, dabei aber die Fehlerausgabe beachten, also z.B.
Code:
path-to script/script >/tmp/script.log 2>&1

Gruß Benares
 

WasNdas?

Benutzer
Mitglied seit
26. Jun 2013
Beiträge
47
Punkte für Reaktionen
0
Punkte
6
Hallo Benares,

danke für Deinen Hinweis auf das Umleiten von STDERR. Jetzt weiß ich zumindest, das eine Library von Java nicht geladen werden kann:

/volume1/@appstore/java7/jre/bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory

Ich habe zwar diverse Variablen definiert (JAVA_HOME, PATH, CLASSPATH) aber die scheinen irgendwie keine Auswirkung zu haben. So als werden sie nicht benutzt.

Es wäre nett, wenn Du mir dabei auch noch auf die Sprünge helfen könntest.

Schönen Abend noch
 

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
12.310
Punkte für Reaktionen
2.869
Punkte
423
Hast du Variablen auch exportiert?
Code:
JAVA_HOME=...
export JAVA_HOME
...
Ansonsten werden sie nicht an Subprozesse vererbt.
 

WasNdas?

Benutzer
Mitglied seit
26. Jun 2013
Beiträge
47
Punkte für Reaktionen
0
Punkte
6
Hast du Variablen auch exportiert?
Code:
JAVA_HOME=...
export JAVA_HOME
...
Ansonsten werden sie nicht an Subprozesse vererbt.
Hallo Benares,

ja das habe auch probiert und erhalte dann folgendes:
/volume1/homes/admin/server/server.sh: export: line 6: JAVA_HOME
: bad variable name

Ich benutze in meinem Skript #!/bin/sh. Sollte ich da evtl. eine andere Shell benutzen?
Ansonsten bin ich mit meinem Latein am Ende. Hast Du noch eine Idee?
 

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
12.310
Punkte für Reaktionen
2.869
Punkte
423
Ich wüsste nicht, warum das nicht gehen sollte. Grad mal probiert:
Code:
DS212> cat xxx
#!/bin/sh
IRGENDWAS=/volume1/daten/scripts
export IRGENDWAS
echo $IRGENDWAS
DS212> ./xxx
/volume1/daten/scripts
DS212>
Hast du evtl. Leerzeichen vor/hinter dem =?
Poste mal bitte das ganze Script
 

WasNdas?

Benutzer
Mitglied seit
26. Jun 2013
Beiträge
47
Punkte für Reaktionen
0
Punkte
6
Hallo Benares,

ich habe mal Dein Skript genommen und als xxx.sh abgespeichert:
Rich (BBCode):
#!/bin/sh
IRGENDWAS=/volume1/daten/scripts
export IRGENDWAS
echo $IRGENDWAS

Wenn ich das in der SSH Konsole von Putty via
Rich (BBCode):
/bin/sh /volume1/homes/admin/xxx.sh
starte, dann erhalte ich folgende Antwort:
Rich (BBCode):
SAM_DS213> /bin/sh /volume1/homes/admin/xxx.sh
: bad variable namen/xxx.sh: export: line 3: IRGENDWAS
SAM_DS213>
Ohne die Angabe von /bin/sh kann ich das Skript überhaupt nicht starten: weder mit xxx.sh (-sh: xxx.sh: not found) noch mit ./xxx.sh (-sh: ./xxx.sh: not found). Dabei sollten die Rechte dafür doch ausreichen:
Rich (BBCode):
SAM_DS213> pwd
/volume1/homes/admin
SAM_DS213> ll
drwxr-xr-x    3 admin    users         4096 Aug 20 20:07 .
drwxr-xr-x    7 root     root          4096 Jun 25 21:06 ..
-rwxr-xr-x    1 admin    users           80 Aug 20 20:07 xxx.sh

Kannst Du Dir das erklären? Ich hoffe mal, ja...
 

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
12.310
Punkte für Reaktionen
2.869
Punkte
423
Klar kann ich. Du hast den falschen Editor verwendet. Vermutlich siehst du mit "vi xxx.sh" lauter "^M" an den Zeilenenden, stimmts?
Die Datei hat dann Windows/DOS-Format mit CarriageReturn,LineFeed (CRLF, CR wird als ^M dargestellt) an den Zeilenenden, Linux erwartet nur LFs an den Zeilenenden.

Verwende vi als Editor unter Linux oder, wenn es schon Windows sein muss, Notepad++ oder den Editor in WinSCP mit den richtigen Einstellungen. Üb mal ein wenig mit vi, unter Linux kommt man längerfristig nicht darum herum, im Wiki findest du ne kurze Einweisung.

Gruß Benares
 
Zuletzt bearbeitet:

WasNdas?

Benutzer
Mitglied seit
26. Jun 2013
Beiträge
47
Punkte für Reaktionen
0
Punkte
6
Super, ich hatte schon den richtigen Editor (Notepad++) verwendet aber and die Zeilenende Einstellung hatte ich nicht gedacht...

Der export funktioniert jetzt, allerdings meckert der java Aufruf immer noch:

/volume1/@appstore/java7/jre/bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory

Ich habe auch schon den LD_LIBRARY_PATH=/volume1/homes/admin/server:/volume1/@appstore/java7/jre/lib/arm/jli gesetzt und die Variable exportiert aber das hat nicht geholfen. Ich habe in den Umgebungsvariablen in der SSH Shell auch nichts entdecken können, was auf das Verzeichnis mit der Datei libjli.so hingewiesen hätte.

Gibt es noch eine Variable die ich setzen muß, damit die Library von Java gefunden wird?

Danke für Deine Geduld
 

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
12.310
Punkte für Reaktionen
2.869
Punkte
423
Java ist nicht so mein Fall, da musst du andere, z.B. Tante Google fragen.
Such mal mit "find / -name 'libjli*'" ob die Library überhaupt vorhanden ist und wo sie liegt. Dann nimm das Verzeichnis in LD_LIBRARY_PATH auf, wenn das für Java überhaupt die richtige Variable ist.

Gruß Benares
 
Zuletzt bearbeitet:

WasNdas?

Benutzer
Mitglied seit
26. Jun 2013
Beiträge
47
Punkte für Reaktionen
0
Punkte
6
...
Such mal mit "find / -name 'libjli*'" ob die Library überhaupt vorhanden ist und wo sie liegt. Dann nimm das Verzeichnis in LD_LIBRARY_PATH auf, wenn das für Java überhaupt die richtige Variable ist.
Moin,

genau das habe ich bereits gemacht. Aber LD_LIBRARY_PATH ist wohl nicht die richtige Variable. In der SSH Konsole ist diese Variable auch überhaupt nicht gesetzt.

Vielleicht ist hier ja noch jemand anderes der mir da weiterhelfen kann.

Nochmals vielen Dank für Deine geduldigen Antworten
 

Merthos

Benutzer
Mitglied seit
01. Mai 2010
Beiträge
2.709
Punkte für Reaktionen
1
Punkte
84
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat