PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Shell: Steuerung einer Endlosschleife



nachtengel06
18-11-2007, 08:53
Hallo zusammen!

Habe ein kleines problem. Habe jetzt ein wenig mit Shell angefangen und komm jetzt leider nicht weiter. Es geht um folgendes:

Ich möchte gerne einen Prozess immer neustarten lassen wenn dieser nicht mehr läuft. Zugleich möchte ich diesen Prozess auch starten/stoppen/neustarten können. Und hier ist das Problem ich weiß einfach nicht wie ich das am besten mache. Eine Endlosschleife die immer den prozess neustartet wenn er abgestürzt ist habe ich bereits hinbekommen - auch diese Start/neustart/stop Funktion aber bekomme es einfach nicht verbunden.

Kann mir jemand helfen? Wie muss ich an die ganze sache ran gehen?

liebe grüße
nachtengel

jan61
19-11-2007, 20:37
Moin,

so ganz komme ich nicht mit, was Du willst. Möchtest Du innerhalb der Endlos-Schleife abhängig von einer bestimmten Bedingung den Prozess entweder stoppen, starten oder nach Abschuss neu starten können? Willst Du diese Bedingung (Start/Stop/Restart) von aussen setzen können?

Wenn ich mit der Vermutung recht habe, dann ginge es z. B. mit einer Steuerdatei:


function starte_prozess() {
...
}
function stoppe_prozess() {
...
}
function restarte_prozess() {
...
}

while true; do
case "`cat steuerdatei 2>/dev/null`" in
"start") starte_prozess;;
"stop") stoppe_prozess;;
"restart") restarte_prozess;;
esac
sleep 10
done
Dann kannst Du per "echo start >steuerdatei" usw. die Abarbeitung innerhalb des case-Switch steuern.

Jan

nachtengel06
20-11-2007, 10:14
Danke erstmal für deine Antwort das sieht schon sehr gut aus!

Ich versuchs nochmal kurz und knapp zu beschreiben:

Ich möchte gerne einen Server ("Serverprozess" => GameServer) der abstürzt wieder automatisch neustarten lassen. Dieses Script möchte ich gerne aber auch mit "Start/Stopp/Restart" verwalten können (./script start/stopp/restart), sodas ich auch wenn der Server aus ist ihn über ./script start - starten kann bzw. wenn er läuft über ./script restart - neustarten kann + möchte die Endlosschleife stoppen können d.h. ich brauche noch einen Parameter für "Stopp" der das Restarten bzw. das script beendet.

Mein Server Startbefehl sieht dann so aus: screen -d -m -S $SVRCNAME $DIR/$SCRIPT $COMMAND

Wie würde das ganze dann bei deinem Beispiel aussehen?

Danke für die Hilfe!

jan61
20-11-2007, 23:32
Moin,

das sieht schon ein wenig anders aus. Da bietet sich folgendes Gerüst an, das auch auf Steuerdateien verzichten kann. Du bastelst das Script sozusagen mit Varianten (wobei die "start"-Variante eigentlich nicht nötig ist, das Script kann ja nach dem Start gleich überwachen):

#! /bin/bash

# wenn Parameter fehlt: gepflegte Fehlermeldung + unwirsches Ende
if test -z "$1"; then
echo "usage: $0 start|stop|restart" >&2
exit 1
fi

# mal gucken, ob Serverprozess rennt
is_running="`ps -ef | grep Serverprozess | grep -v grep`"

# abh. von den Parametern weiter
case "$1" in
start)
# ist verstorben: Starten
test -z "$is_running" && /Pfad/zum/Serverprozess
;;
stop)
# zappelt noch: Killen
test -n "$is_running" && killall Serverprozess
# ggf. Script-Instanz in restart-Schleife ebenfalls killen
killall `basename $0`
;;
restart)
# aller 10 Sekunden gucken, ggf. Neustarten
while true; do
test -z "$is_running" && /Pfad/zum/Serverprozess
sleep 10
is_running="`ps -ef | grep Serverprozess | grep -v grep`"
done
;;
*)
# falscher Parameter: meckern und raus
echo "usage: $0 start|stop|restart" >&2
exit 1
;;
esac

exit 0
Vorsicht: ungetestet und nur als prinzipieller Bauplan zu verstehen (Errorhandling, Serverprozess evtl. im Hintergrund starten, wenn er das nicht selbst tut, usw.).

Jan