# Automatischer Start (init.d) mithilfe von Yast/Runlevel-Editor auf Suse?



## lukelukeluke (11. November 2005)

Hallo miteinander,
Ich habe ein kleines Problem. Mein Server läuft mit Suse 9.0, zufriedenstellend.
Ich möchte darauf 2kleine Server-Anwendungen laufen lassen. Die eine ist TeamSpeak 2 Server, die andere ein selbst gebasteltes Java Programm(Server, aber kein Dämon), welches ich mit nohup aufrufe.
Das die 2 Progis automatisch gestartet werden können, habe ich 2 kleine skripte (in /etc/init.d/) geschrieben, anhand Tutorial auf dem Netz:
*teamspeak*

```
#! /bin/sh
. /etc/rc.status
rc_reset
case "$1" in
        start)
                echo -n "Starting TeamSpeak 2 Server"
                cd /opt/TeamSpeak2/
                ./teamspeak2-server_startscript start
                rc_status -v
                ;;
        stop)
                echo -n "Shutting down TeamSpeak 2 Server"
                cd /opt/TeamSpeak2/
                ./teamspeak2-server_startscript stop
                rc_status -v
                ;;
        restart)
                $0 stop
                $0 start
                rc_status
                ;;
        *)
                echo "Usage: $0 {start|stop|restart}"
                exit 1
                ;;
esac
rc_exit
```

*myserver*

```
#! /bin/sh
. /etc/rc.status
rc_reset
case "$1" in
        start)
                echo -n "Starting MyServer"
                cd /opt/myserver/
                nohup /usr/lib/SunJava2-1.4.2/jre/bin/java -Xmx32m MyServer >/opt/nohup.out &
                rc_status -v
                ;;
        stop)
                echo -n "Shutting down MyServer"
                killall -9 java
                rc_status -v
                ;;
        restart)
                $0 stop
                $0 start
                rc_status
                ;;
        *)
                echo "Usage: $0 {start|stop|restart}"
                exit 1
                ;;
esac
rc_exit
```

Von Hand funktionieren diese Skripte einwandfrei, mit folgenden Befehlen:
/etc/init.d/myserver start
/etc/init.d/teamspeak start
Wenn ich das mit TOP überprüfe, starten die beiden Programme ohne Probleme.

Wenn ich jedoch mit "yast" diese Progis zum automatischen start (Runlevel 2, 3, 5) hinzufügen will, geht das irgendwie nicht. Ich habe zwar das "x" bei allen Runleveln. Wenn ich das Progi aber vom Runlevel-Editor starten will, kommt da nur das kleine Fesnter "starting myserver", das gleiche mit teamspeak. Dort hängt Yast und ich kann nur mit Ctrl-C raus.
Hat jemand eine Idee wieso das so ist? 
Vielen Dank!
-luke


----------



## the-preacher (23. November 2005)

Moinsen,
warum sich Yast dort aufhängt kann ich auch nicht beantworten, aber die Verlinkung der Starts kann man auch selbst erstellen. Für die einzelnen Runlevel existieren die Unterordner rc3.d und rc5.d für die Runlevel 3 und 5. Wenn deine Dienste auch in anderen Runlevel gestarten werden sollen, dann muss selbstverständlich auch in den Ordnern ein Link auf das Script gesetzt werden. Die Links existieren in den Ordnern sofern dieser Dienst gestartet werden soll. Die Reihenfolge wird durch die Nummerierung angegeben, die auch sehr wichtig ist. Wenn deine Dienste von der Netzwerkkarte abhängig sind, dann musste Du deine Dienste danach eintragen. S05network beispielsweise, dann kann der Link S06myserver lauten. S0X steht dabei für das Starten und K0X für das Herunterfahren des Rechners. Die Erstellung des Links könnte dabei so aussehen:
ln -s /etc/init.d/myserver /etc/init.d/rc3.d/S06myserver
Ich hoffe ich konnte ein wenig weiterhelfen, wenn noch was unklar ist einfach nochmal schreiben.
(Ebenfalls eventuell möglich: chkconfig --add Dienst Runlevel)
Gruß TP


----------



## lukelukeluke (25. November 2005)

Hi TP,
Vielen Dank für deine Antwort, jetzt ist mir einiges klarer...
Ich mache die ganze Sache also von hand, das heisst ich erstelle folgendes (S05 ist network, S07 und S08 ist noch nichts):
ln -s /etc/init.d/myserverone /etc/init.d/rc3.d/S07myserverone
ln -s /etc/init.d/myservertwo /etc/init.d/rc3.d/S08myservertwo

Was mir jetzt aber noch nicht klar ist:
- Wie mache ich das, dass ein Progi (z.B. myserver) unter einem anderen User gestartet wird? Habe extra bereits 2 user erstellt mit denen ich manuell die server schon gestartet habe, hat funktioniert).
- Wie sieht es mit dem Kill aus? Ist die K-Rheinfolge die Kill Rweihenfolge, also zuerst wird K01 gekillt? Müssen meine Server dort auch hin, was passiert wenn ich sie nicht killen lasse? Und wenn es K01 - K20 schon gibt, muss ich dann jedesmal wenn ich ein Progi hinzufüge alle dieses K's manuell eins nach oben verschieben dass ich meinen server zuerst stoppen kann?
Vielen Dank für deine Hilfe
Gruss, luke


----------



## the-preacher (25. November 2005)

Moin Moin,
wenn die Progs unter einem anderen User laufen sollen muss der Eigentümer geändert werden, und zwar unter dessen Rechte das Prog laufen sollen. Damit die UID nicht von der Shell geändert wird (zu dem User der das startet) sollte noch das SUID Bit gesetzt werden. chmod 4XXX myserver - XXX steht dabei für die bisherige Berechtigung. Soll die Gruppenberechtigung auch geändert werden, d.h. das eine spezielle Gruppe die Prozesse beherbergt, dann die 4 durch eine 6 ersetzen, dann ist auch das GUID Bit gesetzt. Die Gruppenzugehörigkeit sollte dann ebenfalls geändert werden. (Nur wenn es notwendig ist aufgrund von speziellen Berechtigungen im System)
Beim Herunterfahren des Systems ist der Vorgang adäquat zum starten, K01 wird zuerst beendet. Wenn alle Zahlen belegt sind macht das nichts, die können durchaus mehrfach belegt werden, ein manuelles Abändern ist nicht notwendig. Auch hier ist auf die Reihenfolge zu achten. Wenn Sie dort nicht drin stehen ist das auch nicht weiter wild, da die Funktionalität bereits durch Beenden der Netzwerkunterstützung beendet wird. Zum Schluss wird auch an alle Dienste ein HUP und KILL Signal gesendet, so das sich auch diese Dienste immer beenden. Ein Kill Signal kann von keinem Prozess ignoriert werden (außer init (PID=1)). Sinnvoll ist aber das Eintragen in die Links der Runlevel.

Gruß TP


----------

