PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bash-Schleife



Siro
24-04-2008, 18:15
Hallo,

ich bin neu hier und habe zum Anfang gleich einmal eine Frage.

Ich kenne mich mit Bash noch nicht so gut aus und brauche ein simples Skript. Ich hoffe Ihr könnt mir helfen.

Es soll folgendes tun:

Es soll die Datei "control" öffnen. Wenn die Datei "0" enthält, soll das Skript die Datei in 5 min erneut öffnen und wieder prüfen, also eine Endlosschleife. Wenn die Datei jedoch "1" enthält, soll das Skript eine Anwendung starten, warten bis diese beendet ist und danach wieder die Datei auf Ihren Inhalt prüfen, also auch wieder Endlos.

Mein Ziel ist, das ganze auf einem Server laufen zu lassen, sodass ich das Programm per Webinterface ("0" in Datei control schreiben) stoppen bzw. starten kann.

Ich hoffe Ihr könnt mir helfen.

Achja, das programm, welches gestartet werden muss ist: "tclsh ebd.tcl".

Vielen Dank für alle Antworten.

undefined
25-04-2008, 10:14
Siehe Manpage test und sleep
Beispiel


#!/bin/sh
> /tmp/meineDatei.log
test -s /tmp/meineDatei.log || sleep 5
echo "Warteschleife Beendet"
exit 0

BLUESCREEN3D
25-04-2008, 20:24
@undefined: Das ist doch keine Schleife ...

@Siro: Eine Endlosschleife geht so:

while true; do
#Schleifeninhalt
done
In die Schleife kommt eine if-Abfrage. Wie das geht, steht in "man bash" - wenn du es nicht hinkriegst, poste deinen Quellcode.

undefined
25-04-2008, 21:28
Habe ich auch nicht behauptet, tips mit endlos schleifen gebe ich nie ;)

BLUESCREEN3D
25-04-2008, 22:25
tips mit endlos schleifen gebe ich nie ;)
Das ist doch mal was :D

jan61
30-04-2008, 22:14
Moin,


Habe ich auch nicht behauptet, tips mit endlos schleifen gebe ich nie ;)

dumme Frage: Warum antwortest Du dann auf eine Frage zu einer Endlosschleife??? Noch ne dumme Frage: wenn Du Tipps zu man-Pages gibst, warum liest Du sie dann nicht? sleep nimmt Argumente in Sekunden entgegen, nicht in Minuten. sleep 300 ist demzufolge nach Adam dem Riesen der 5-Minuten-Schlaf. Ach ja, eine dumme Frage hab ich noch: Was ist der Sinn Deiner test -s Abfrage? Damit kriegst Du nicht raus, ob eine 0 in der Datei steht.

@Siro: Deine Aufgabe kannst Du auf unterschiedliche Art lösen: Entweder Du lässt tatsächlich ein Script in einer Endlos-Schleife kreiseln, so wie BLUESCREEN3D es angedeutet hat, oder Du rufst ein "Einmal-Script" auf so ähnlich wie von undefined (nur mit richtigem sleep-Parameter) und lässt das per crontab (siehe man crontab und man 5 crontab) alle 5 Minuten laufen. Eine Endlos-Schleife hat einen Nachteil: Kackt das Script ab, dann ist es vorbei mit dem Starten Deiner Anwendung. Die crontab-Variante hat auch einen Nachteil: Sie startet stur alle 5 Minuten.

So, jetzt eine Variante, wie Du das machen kannst. Wenn Du Dich für die crontab-Variante entscheidest, lässt Du einfach die Schleife und die ganzen sleep's weg.

# Start Endlosschleife
while true; do
# wenn Datei "control" nicht da ist: Schlafen, naechste Runde
if test ! -f control; then
sleep 300
continue
fi
# Inhalt von Datei "control" kontrollieren
if test "`cat control`" = "0"; then
# in "control" steht 0: schlafen, dann naechste Runde
sleep 300
else
# in "control" steht was anderes als 0: Action
do_something
fi
done
Jan

P.S.: Du kannst beide Varianten kombinieren, indem Du das Script die Endlos-Schleife machen lässt und von außen per crontab regelmäßig prüfst, ob das Ding noch lebt. Aber das behandeln wir in der nächsten Folge ;-)