Warteschleife

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
madaed
Beiträge: 48
Registriert: 08.08.2003 22:17:30

Warteschleife

Beitrag von madaed » 13.08.2003 14:40:52

Ich brauche in einem Shell Script eine Warteschleife.
Grob geschrieben sowas:

Code: Alles auswählen

  while [ ! -f $FLAG_FILE ] sleep 1
Probem ist, dass dieses Script dann natürlich tierisch Resourcen frisst.
Kann ich die Priorität des Scripts irgendwie runtersetzen, sodass es wirklich nur im Wartezustand bleibt? Oder hat jemand ne bessere Idee?

romulus
Beiträge: 328
Registriert: 14.12.2002 13:29:43
Kontaktdaten:

Beitrag von romulus » 13.08.2003 15:05:36

Warum sollte er während "sleep 1" tierisch Ressourcen verbrauchen?
Ciao
Romulus

Benutzeravatar
blackm
Moderator und Co-Admin
Beiträge: 5921
Registriert: 02.06.2002 15:03:17
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von blackm » 13.08.2003 15:15:26

Ja,

Code: Alles auswählen

sleep 1
verbraucht nicht so wirklich viel (wird ja auch nicht so wirklich was gemacht..). Du kannst aber die Zeit die nichts gemacht werden soll auch nach oben setzen.

Wenn das Script aber immer bei dir im Hintergrund lafen soll, dann wäre es bessere einen Disk and excecution monitor (aka. daemon) zu schreiben. Der lauscht am besten an einem TCP Port und das Programm, das $FLAG_FILE anlegt kontaktiert den daemon dann über den Port und sagt ihm, "Ej, der file ist da. Kannst loslegen". Und dann legt das Programm los...

by, Martin
Schöne Grüße

Martin

Neu im Forum? --> https://wiki.debianforum.de/debianforum ... tensregeln
Log- und Konfigurationsdatein? --> pastebin.php
Forum unterstützen? --> https://wiki.debianforum.de/debianforum.de/Spenden

madaed
Beiträge: 48
Registriert: 08.08.2003 22:17:30

Beitrag von madaed » 13.08.2003 16:36:58

Danke für die Antwort.
Ein Daemon kommt allerdings nicht in Frage.
Es geht lediglich darum, zwei Cronjobs so zu koordinieren, dass sie sich nicht überschneiden, aber möglichst zeitnah ausgeführt werden.

In diesem Fall geht es um folgende Scripte:

1. copy.sh - Kopiert die Daten ins Backup Verzeichnis
2. burn.sh - Brennt die Daten auf DVD.

copy.sh wird täglich, burn.sh wird monatlich ausgeführt.
Drumrum gibts noch weitere Scripte, weshalb die Ausführung möglichst zeitnah sein muss (Datenbank muss runtergefahren werden und sollte nicht zu lange down sein).

Damit burn.sh noch nicht anfängt, bevor copy.sh fertig ist, soll copy.sh eine Flag setzen und burn.sh soll erst anfangen, wenn die Flag gesetzt ist (die Flag wird ins tmp gesetzt und dieses alle paar Stunden aufgeräumt, sodass sich alte Flags nicht in die Quere kommen).
So lange muss eine Warteschleife laufen (solange keine Flag da, warten).

Da die Datenmenge variieren kann, kann ich nicht einfach die Cronjobs Pi mal Daumen versetzt starten lassen oder grob geschätzt ein sleep einsetzen.

Ein Daemon lohnt sich vom Aufwand her garnicht.
Dafür sind die Scripts viel zu simpel.


P.S: Warum läd eigentlich die Seite hier andauernd neu. Musste dreimal neu anfangen, weil dieser komische Reload dazwischen kam. Was war das??!!

Benutzeravatar
blackm
Moderator und Co-Admin
Beiträge: 5921
Registriert: 02.06.2002 15:03:17
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von blackm » 13.08.2003 17:02:51

madaed hat geschrieben:P.S: Warum läd eigentlich die Seite hier andauernd neu. Musste dreimal neu anfangen, weil dieser komische Reload dazwischen kam. Was war das??!!
Das ist gegen das langsame Tippen :mrgreen:
Ne, kein Plan was das war...bei mir ist es noch nie aufgetreten. Im html header steht auch nix von reload drin.

Warum lässt du burn.sh nicht von copy.sh aufrufen? Etwa so:

Code: Alles auswählen

if [ < test ob der erste des Monats ist>]
. /path/to/burn.sh
fi
?!
Schöne Grüße

Martin

Neu im Forum? --> https://wiki.debianforum.de/debianforum ... tensregeln
Log- und Konfigurationsdatein? --> pastebin.php
Forum unterstützen? --> https://wiki.debianforum.de/debianforum.de/Spenden

madaed
Beiträge: 48
Registriert: 08.08.2003 22:17:30

Beitrag von madaed » 13.08.2003 17:13:33

Schon wieder. Die Seite hat einfach neu geladen. Scheisse sowas...liegt wohl an meinem Browser...also STRG+C...

Natürlich könnte ich den Aufruf so gestalten.
Aber es wäre nicht sonderlich sauber.
Ich versuche meine Scripts immer modular aufzubauen, sodass ich sie bei der nächsten Konstruktion einfach übernehmen kann. Internte Querverweise kommen da nicht in Frage...
Ausserdem ist es wesentlich nachvollziehbarer, wenn ich die Cronjobs getrennt laufen lasse.
Wenn mal jemand anders an dem Server arbeiten muss, ist es doch wesentlich besser, wenn direkt aus der Crontab hervorgeht, wer, wann, was macht.
Es ist einfach sauberer.
Und bevor ich irgendwelche dirty Hacks baue, hab ich mir gedacht:
Fragste das debianforum :)


P.S: Scheiss reload. Der schmeisst sogar direkt alles ausm Cache. Ich musste schon wieder (trotz STRG+C)dreimal anfangen :evil:

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 13.08.2003 17:16:19

Also ich finde das mit dem "while....sleep" schon OK. Du kannst ja grob abschätzen, wie lange das copy.sh braucht (wenn das "normalerweise" nur ein paar Sekunden dauert, dann machst Du halt sleep 1, wenn das normalerweise mehrere Minuten dauert, machst Du halt sleep 60 usw...

Ressourcenfressen ist das nicht, weil sleep ja genau dazu da ist, nichts zu tun...

Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

madaed
Beiträge: 48
Registriert: 08.08.2003 22:17:30

Beitrag von madaed » 13.08.2003 17:24:26

Das sleep steht doch nur da, damit irgendwas in der while steht.
Es geht darum, dass das Script solange wartet, bis das andere fertig ist.
Und ich kann eben nicht abschätzen, wie lange es dauert.
Es geht um einen Archivserver. Der wird regelmäßig aufgeräumt.
Die Datenbestände können zwischen 500MB und mehreren GB liegen (daher DVD Backup).
Ein einfaches Sleep reicht also nicht...

Und habt ihr mal ausprobiert, wieviel Power eine while ziehen kann, die ein paar Minuten läuft? Probierts mal aus...

romulus
Beiträge: 328
Registriert: 14.12.2002 13:29:43
Kontaktdaten:

Beitrag von romulus » 13.08.2003 17:33:31

trotzdem ist sleep doch ok. Du testest ob deine Datei schon da ist und wenn nicht legt sich der Prozess 1 Sekunde 10 Sekunden 1 Minute ... whatever schlafen. Und wenn die Datei da ist, dann wird halt gearbeitet. Wo ist das Problem?
Ciao
Romulus

madaed
Beiträge: 48
Registriert: 08.08.2003 22:17:30

Beitrag von madaed » 13.08.2003 17:37:53

Das Problem ist, dass diese Abfrage, ob die Datei vorhanden ist, tausendfach aus System einprasselt. Und das in kürzesten Abständen. Und das, wo der Plattendurchsatz sowieso schon durchs Kopieren ziemlich heftig ist.
Mein Gedanke war, obs da nicht eine schonendere Methode gibt oder ob ich nicht wenigstens während der Warteschleife diesem Prozess eine niedrige Priorität zuweisen kann, sodass das System weiterhin ordentlich arbeiten kann.
Denn wenn ich DEN Server abschiesse, hab ich ein Problem...;)

romulus
Beiträge: 328
Registriert: 14.12.2002 13:29:43
Kontaktdaten:

Beitrag von romulus » 13.08.2003 17:53:36

du hast nicht wirklich verstanden was sleep macht oder?

sleep ist (wie der name ja schon andeutet) dafür gedacht, dass der aufrufende Prozess sich die angegebene Zeit komplett schlafen legt. Der Prozess ist im Zustand "sleeping" und macht gar nichts und kann demzufolge das System auch nicht belasten. Wenn du den Prozess jede Sekunde schlafen legst, sollte das schon ausreichen. Eventuelle reichen dir ja auch 10 Sekunden oder 1 Minute, dann hängt der Prozess eine Minute rum und tut nix mehr.

Wenn ich es mir recht bedenke, würde es aber auch ausreichen, den per Cronjob jede Minute starten zu lassen und wenn die Datei nicht da ist, gleich wieder abzubrechen. Denn cron macht auch nichts anderes als 1 mal die Minute zu schauen ob was zu tun ist und sich dann schlafen zu legen.
Ciao
Romulus

Benutzeravatar
blackm
Moderator und Co-Admin
Beiträge: 5921
Registriert: 02.06.2002 15:03:17
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von blackm » 13.08.2003 17:57:00

Also while und sleep machen bei mir 0 % Last

Code: Alles auswählen

blackm@client:~$ while true;do sleep 1;done
. Wegen dem Platzendurchsatz...kann sich gerinfügig auswirken, das Backup dauert dann vielleicht ein paae Sekunden länger (Die Testfunktion schreib / liest ja nicht viel von der Platte).
Wenn du das aber als Problem siehst: richte dir eine kleine RAM Disk ein und schreib dort die Datei rein. 500 kb reichen ja.

by, Martin
Schöne Grüße

Martin

Neu im Forum? --> https://wiki.debianforum.de/debianforum ... tensregeln
Log- und Konfigurationsdatein? --> pastebin.php
Forum unterstützen? --> https://wiki.debianforum.de/debianforum.de/Spenden

Benutzeravatar
spiffi
Beiträge: 1128
Registriert: 09.08.2003 19:02:27

Beitrag von spiffi » 13.08.2003 18:31:00

Hm, also wenn Deine Skripte modular halten willst, würde ich jede Abhängigkeit aus den Skripten raushalten (also auch die Warteschleife) und die Notwendigkeit der Synchronisation beider Skripte an anderer Stelle modellieren, beispielsweise in der crontab:

Code: Alles auswählen

# copy und burn am 1. jedes Monats um 0:30 Uhr.
30 0 1 * *      /path/to/copy.sh && /path/to/burn.sh
# copy only an jedem anderen Tag um 0:30 Uhr.
30 0 2-31 * *   /path/to/copy.sh
Dann sieht auch jeder, der einen Blick auf die crontab wirft auf den ersten Blick, was Sache ist.

Olaf Dietsche
Beiträge: 520
Registriert: 12.06.2003 23:18:50
Wohnort: Siegburg

Beitrag von Olaf Dietsche » 13.08.2003 18:35:21

Du hast mehrere Möglichkeiten:
- Du machst keinen sleep, sondern hängst den jetzt wartenden Prozess in einem Shellskript an den Backupprozess hinten dran. Kein busy waiting, keine Systembelastung.
- Falls du trotz allem zwei separate Prozesse haben willst, dann können der Sleepprozess und der Backupprozess kooperieren. Der Warteprozess liest aus einer named Pipe und wird dadurch blockiert. Wenn der Backupprozess zu Ende ist, schreibt er etwas in die named Pipe. Dadurch erwacht der Sleepprozess und weiß, daß er weitermachen kann.
- Du lässt dein while-Schleife wie sie ist, aber verlängerst die sleep Zeit z.B. auf zehn Minuten oder eine Stunde und verlagerst die Schleife in ein eigenes Skript. Dann kann der Backupprozess dieses separate Skript mit kill beenden, wenn er fertig ist. Das aufrufende Skript weiß dann, daß der Backup fertig ist.

Du kannst dir natürlich weitere Variationen dieser Kooperation ausdenken.

Benutzeravatar
blackm
Moderator und Co-Admin
Beiträge: 5921
Registriert: 02.06.2002 15:03:17
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von blackm » 13.08.2003 18:50:18

Olaf Dietsche hat geschrieben:- Falls du trotz allem zwei separate Prozesse haben willst, dann können der Sleepprozess und der Backupprozess kooperieren. Der Warteprozess liest aus einer named Pipe und wird dadurch blockiert. Wenn der Backupprozess zu Ende ist, schreibt er etwas in die named Pipe. Dadurch erwacht der Sleepprozess und weiß, daß er weitermachen kann.
Kannst du mal posten wie die Komandozeile dafür aussieht?

by, Martin
Schöne Grüße

Martin

Neu im Forum? --> https://wiki.debianforum.de/debianforum ... tensregeln
Log- und Konfigurationsdatein? --> pastebin.php
Forum unterstützen? --> https://wiki.debianforum.de/debianforum.de/Spenden

madaed
Beiträge: 48
Registriert: 08.08.2003 22:17:30

Beitrag von madaed » 13.08.2003 23:23:39

In Ordnung. Die Lösung mit dem Direktaufruf klingt am ordentlichsten.
Um die Modularität zu behalten, mache ich das dann am besten so:
backup.sh:

/bin/sh copy.sh
if [ erster des monats ]; then
/bin/sh burn.sh
fi

Dann hinterlasse ich eben ne Doku. Des passt scho.
Vielen Dank für die Tips!

Olaf Dietsche
Beiträge: 520
Registriert: 12.06.2003 23:18:50
Wohnort: Siegburg

Beitrag von Olaf Dietsche » 14.08.2003 05:07:56

blackm hat geschrieben:Kannst du mal posten wie die Komandozeile dafür aussieht?
Zuerst die named Pipe erzeugen

Code: Alles auswählen

mkfifo /tmp/myfifo
Dann den Sleepprozess warten lassen

Code: Alles auswählen

read x </tmp/myfifo
echo $x
und den Backupprozess arbeiten lassen mit abschließender Benachrichtigung

Code: Alles auswählen

sh backup.sh
echo "Bin fertig" >/tmp/myfifo

Benutzeravatar
blackm
Moderator und Co-Admin
Beiträge: 5921
Registriert: 02.06.2002 15:03:17
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von blackm » 14.08.2003 10:55:19

Wieder was gelernt :-) Sieht irgendwie gut aus...
Schöne Grüße

Martin

Neu im Forum? --> https://wiki.debianforum.de/debianforum ... tensregeln
Log- und Konfigurationsdatein? --> pastebin.php
Forum unterstützen? --> https://wiki.debianforum.de/debianforum.de/Spenden

Antworten