Programm im Runlevel 3 und 5 starten

Status
Für weitere Antworten geschlossen.

roskas

New Member
Hallo zusammen,

also ich habe folgendes Problem:
Ich habe mir ein Java-Programm geschrieben, was alle 10 min etwas
für mich erledigt.
Das Programm wollte ich immer beim Systemstart starten, wenn
das System in den Runlevel 3 oder 5 hochfährt.
Also habe ich ein shell skript geschrieben, welches ich in das verzeichnis
/etc/init.d/ gepackt habe.

Hier erstmal das Skript:

Code:
#! /bin/sh
# /etc/init.d/ipshare
#
# description: speichert IP-Adresse der Fritz!Box auf einem Webserver
### BEGIN INIT INFO
# Provides:          ipshare
# Required-Start:
# Required-Stop:
# Default-Start:           5
# Default-Stop:
# X-UnitedLinux-Default-Enabled: yes
# Description:       speichert IP-Adresse der Fritz!Box auf einem Webserver
### END INIT INFO

. /etc/rc.status

rc_reset


case "$1" in
  start|b)
	echo -n "Startet IPShare"
	cd /home/Tux/Documents/Fritz
	java Fritz
	;;
  status)
	echo "$0: status OK"
	;;
  stop)
	;;
  *)
	echo "Usage: $0 start"
	exit 1
esac
rc_exit
Danach bin ich im Yast auf den Leveleditor gegangen, um das Skript
für Runlevel 3 und 5 zu aktivieren. Um es zu testen bin ich auf Dienst starten gegangen und das Dialogfenster mit dem Inhalt:"Startet ipshare" bleibt für eine ewigkeit offen.
Ich denke das das Skript das Java-programm aufruft, welches ja eine ewigkeit läuft und dadurch das Skript nicht beendet wird. Es bleibt sozusagen immer an der Stelle "java Fritz" stehen, bis ich das Java-Programm beende.

Was kann ich machen, das das Skript mein Programm aufruft und dann weiter durchläuft?
 

Rain_Maker

Administrator
Teammitglied
AW: Programm im Runlevel 3 und 5 starten

Code:
cd /home/Tux/Documents/Fritz
        java Fritz
hier *könnte* der Fehler liegen, da java wahrscheinlich das Paket nicht findet. Heisst das Java-Programm "Fritz"? oder "Fritz.jar"?

Ist es ein .jar-File?

Wie wäre stattdessen
Code:
java -jar /vollständiger_Pfad_zum_Executable/Name_des_Executable
Das wäre dann auch nur eine Zeile Code statt zwei.

Greetz,

RM
 

roskas

New Member
AW: Programm im Runlevel 3 und 5 starten

ne da liegt nicht der fehler.
Mein java Programm heißt schon Fritz.class
also mit "java Fritz" starten
wenn ich so in die shell eingebe startet es ja auch das programm.
Es muss etwas damit zu tun haben, dass das Programm unendlich durchläuft und das skript nicht beendet wird.
 

Rain_Maker

Administrator
Teammitglied
AW: Programm im Runlevel 3 und 5 starten

Ich weiß nicht, wie es bei Runlevelscripten genau ist, aber ich habe mir gerade ein paar angesehen und dabei ist mir etwas aufgefallen, was ich auch von cronjobs her kenne.

Programme werden immer mit dem vollständigen Pfad aufgerufen, also versuche mal statt
Code:
java
den Aufruf mit vollständigem Pfad:

Code:
/usr/bin/java
Ausserdem kannst Du noch versuchen (nur so ne Idee) ein & an den Befehl anzuhängen. Du solltest zudem immer prüfen, ob durch das Script überhaupt "java" gestartet wird (top, ps), aus Deiner Beschreibung geht das für mich nicht eindeutig hervor.

Ob vielleicht Fehler in der Syntax des Scripts vorhanden sind, kann ich Dir nicht sagen, dazu habe ich (noch) zu wenig Erfahrung mit BASH-scripting.

Greetz,

RM
 

roskas

New Member
AW: Programm im Runlevel 3 und 5 starten

ja waren gute Tips, jedoch ist es das selbe Problem wie vorher.
Und ich hab java in top gefunden.
Naja wenn irgendeiner noch ne idee hat bitte posten.
Ich werde jetzt erst einmal als vorübergehende Lösung
das skript ins verzeichnis /home/Tux/.kde/Autostart hauen.
So klappt es wenigestens, wenn ich mich beim kde einlogge.
 
AW: Programm im Runlevel 3 und 5 starten

1. (wie RM schon erwähnt hat) Absolute Pfade verwenden.

2. Welche Voraussetzungen sollten denn für dein Programm erfüllt sein?
D.h. welche Dienste sollten vorher gestartet werden?
Momentan ist dein Script das erste in der Startabfolge (und das funktioniert mit Sicherheit nicht).
Also mal Required-Start anpassen.
Z.B.:
Code:
# Required-Start:    $local_fs $remote_fs $network
[edit]
Für das Starten in Runlevel 3 und 5 solltest du zusätzlich noch Default-Start anpassen:
Code:
# Default-Start:     3 5
Btw: funktioniert das Script eigentlich wenn du es nach dem Start manuell ausführst?
Code:
/etc/init.d/ipshare start
 

roskas

New Member
AW: Programm im Runlevel 3 und 5 starten

Also ich eure Tips mal befolgt.

Die erste gute Nachricht ist, dass der Rechner das Skript beim starten erfolgreich startet.
Ich hab jedoch noch ne Frage. Müssen die Skripte durchlaufen?
Also ich hab das Skript nach dem start mal manuell ausgeführt.
Resultat:


Es startet meine java Anwendung und bleibt dann stehen, bis die java Anwendung beendet wurde, danach läuft es weiter durch. Ich will aber natürlich meine anwendung nicht beenden. Dadurch bleibt das dialogfenster von yast natürlich auch so lange stehen, bis die anwendung beendet wurde.
Kann man das nicht umgehen?
 

roskas

New Member
AW: Programm im Runlevel 3 und 5 starten

So habs jetzt definitv raus:

Code:
#! /bin/sh
# /etc/init.d/ipshare
#
# description: speichert IP-Adresse der Fritz!Box auf einem Webserver
### BEGIN INIT INFO
# Provides:          ipshare
# Required-Start: $network
# Required-Stop:
# Default-Start:  3 5
# Default-Stop:
# X-UnitedLinux-Default-Enabled: yes
# Description:       speichert IP-Adresse der Fritz!Box auf einem Webserver
### END INIT INFO

. /etc/rc.status

rc_reset


case "$1" in
  start|b)
	echo -n "Startet IPShare"
	cd /home/Tux/Documents/Fritz
	nohup /usr/java/jdk1.5.0_05/bin/java Fritz </dev/null >>myLogFile 2>>myErrorFile&
	;;
  status)
	echo "$0: status OK"
	;;
  stop)
	;;
  *)
	echo "Usage: $0 start"
	exit 1
esac
rc_exit
hauptmerk ist auf die zeile
Code:
nohup /usr/java/jdk1.5.0_05/bin/java Fritz </dev/null >>myLogFile2>>myErrorFile&
zu legen

Dort wird mein programm in einem Daemon-Modus gestartet, der zusätzlich von der shell gelöst wird und die pipes werden nach </dev/null umgeleitet.
 
AW: Programm im Runlevel 3 und 5 starten

Code:
nohup /usr/java/jdk1.5.0_05/bin/java Fritz </dev/null >>myLogFile2>>myErrorFile&
Das ist ja mal eine kontruktion. :eek:
Bist du dir Sicher, dass es </dev/null heißen muss?
Du willst doch die Ausgabe deines Scriptes nach /dev/null leiten, nicht umgekehrt (also /dev/null als Eingabe für dein Script?).
Bsp.:
Vergleich mal
Code:
cat < ./textdatei
und
Code:
cat ./textdatei > ./textdatei2
(./textdatei natürlich vorher anlegen und mit Text füllen ;) )

Müsste die Umleitung für die Fehlerausgabe nicht 2&> heißen?
Außerdem solltest du 1. die Pfade für die Logfiles angeben und 2. auch sicherstellen, dass diese in regelmäßigen Abständen geleert werden.
(z.B.: /var/log/ipshare und logrotate entsprechend konfigurieren ;) )

Last but not least:
Um ein Startscript als Daemon laufen zu lassen bietet sich start-stop-daemon an:
Z.B.:
Code:
PIDFILE=/var/run/java_fritz.pid
DAEMON="/usr/java/jdk1.5.0_05/bin/java /home/Tux/Documents/Fritz/Fritz"
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON
Mal das Beispielscript /etc/init.d/skeleton und die Man-Page (man start-stop-daemon) anschauen.

Viel Spass! ;)
 

roskas

New Member
AW: Programm im Runlevel 3 und 5 starten

roskas schrieb:
So habs jetzt definitv raus:

Code:
#! /bin/sh
# /etc/init.d/ipshare
#
# description: speichert IP-Adresse der Fritz!Box auf einem Webserver
### BEGIN INIT INFO
# Provides:          ipshare
# Required-Start: $network
# Required-Stop:
# Default-Start:  3 5
# Default-Stop:
# X-UnitedLinux-Default-Enabled: yes
# Description:       speichert IP-Adresse der Fritz!Box auf einem Webserver
### END INIT INFO

. /etc/rc.status

rc_reset


case "$1" in
  start|b)
	echo -n "Startet IPShare"
	cd /home/Tux/Documents/Fritz
	nohup /usr/java/jdk1.5.0_05/bin/java Fritz </dev/null >>myLogFile 2>>myErrorFile&
	;;
  status)
	echo "$0: status OK"
	;;
  stop)
	;;
  *)
	echo "Usage: $0 start"
	exit 1
esac
rc_exit
hauptmerk ist auf die zeile
Code:
nohup /usr/java/jdk1.5.0_05/bin/java Fritz </dev/null >>myLogFile2>>myErrorFile&
zu legen

Dort wird mein programm in einem Daemon-Modus gestartet, der zusätzlich von der shell gelöst wird und die pipes werden nach </dev/null umgeleitet.
EDIT: Hab die Zeile so im Netz gefunden, ist jedoch komisch, dass </dev/null reingeleitet wird, ich habs mal andersrum probiert und da funktionierts auch. Scheint wohl egal zu sein.
Mit dem Errorstream kenn ich das mit 2> datei.txt. Hab ich aus video2brain suse linux 10.1
Danke für den Tipp mit start-stop-daemon, werd ich mir mal angucken.
 
AW: Programm im Runlevel 3 und 5 starten

roskas schrieb:
EDIT: Hab die Zeile so im Netz gefunden, ist jedoch komisch, dass </dev/null reingeleitet wird, ich habs mal andersrum probiert und da funktionierts auch. Scheint wohl egal zu sein.
Nein, das ist nicht egal (auch wenn es im Netz so steht :D ).
Bei > /dev/null wird die Ausgabe, die das Programm produziert nach /dev/null geleitet.
Im umgekehrten Fall wird /dev/null als Eingabe für das Programm verwendet.
Das spielt in deinem Fall keine Rolle, da dein Programm vermutlich keine Eingaben verarbeitet - aber z.B. beim Umgang mit Dateien (z.B. mit sed) kann das sehr wichtig werden. :D
 
Status
Für weitere Antworten geschlossen.
Oben