Skriptfrage: Verzweigung
![](https://seccdn.libravatar.org/avatar/9c21e784e8adf2b95833a223b0495834.jpg?s=120&d=mm&r=g)
Hallo Liste. Ich möchte mein Backup-Skript gern modifizieren, und zwar im Ergebnis so, daß die Zielpartition immer voller und voller werden würde. Um ein Überlaufen zu vermeiden würde ich gerne mein Skript so verzweigen, daß der eine Teil das Backup macht, während der andere laufend prüft, wie voll die Zielpartition ist, und bei überschreiten eines bestimmten Füllungsgrades bestimmte Maßnahmen ergreift. Nun könnte ich es wohl so machen: #!/bin/bash /pfad/zum/prüfungsskript & rsync... Hier würde ich das Prüfungsskript im Hintergrund starten, und es würde gekillt werden, sobald sich das Backupskript selbst sich beendet. Aber das scheint mir nicht so elegant, denn es sind immerhin zwei Skripte notwendig. Kann man so etwas auch in einem Skript zusammenfassen? Wenn ja, wie? -- Andre Tann
![](https://seccdn.libravatar.org/avatar/363424a7062b0e7a90527600f3760d46.jpg?s=120&d=mm&r=g)
Hallo, Am Mon, 14 Aug 2006, Andre Tann schrieb:
Nun könnte ich es wohl so machen:
#!/bin/bash /pfad/zum/prüfungsskript & rsync...
Hier würde ich das Prüfungsskript im Hintergrund starten, und es würde gekillt werden, sobald sich das Backupskript selbst sich beendet.
Aber das scheint mir nicht so elegant, denn es sind immerhin zwei Skripte notwendig. Kann man so etwas auch in einem Skript zusammenfassen? Wenn ja, wie?
So zum Beispiel: ==== #!/bin/bash -x WATCH_DIR="`pwd -P`" IAM="`basename $0`" MINSIZE=4000000 ### <=== ANPASSEN! ### wenn auf der Partition innerhalb von 30s durch's dd (s. run_backup ### unten) weniger Platz frei ist testet man den "Partition voll" ### Fall, sonst den "Backup laeuft durch" Fall. #################################################################### ### Watcher, ueberwacht die Partition die $WATCH_DIR enthaelt get_size() { df "${WATCH_DIR}" | awk '/\//{print $4;}' } watch_disk() { backuppid=$1 while test `get_size` -gt $MINSIZE; do echo "${IAM}: watch_disk(): sleeping..." >&2 sleep 3 done echo "Partition zu voll!" >&2 ### mach was wenn Partition zu voll; wenn nicht wird das script ### voher irgendwann durch das "trap" gekillt. Hier: Backupscript ### killen kill -TERM $backuppid } #################################################################### ### Backup, fuellt die Platte... run_backup() { ### simuliertes Backupscript: watcherpid=$1 echo "$IAM: starting Backup ..." >&2 outfile="`mktemp \"${IAM}.$$.XXXXXX\"`" dd if=/dev/zero of="$outfile" & ddpid=$! sleep 1 rm -f "$outfile" ### die von dd zu befuellende Datei gleich loeschen, sobald dd sich ### beendet oder wenn dd beendet wird (per Hand oder s.u.) wird ### die Datei automatisch freigegeben ### Watcher und dd beenden, trap hierherverlegt um auch dd zu beenden trap "kill -TERM $watcherpid $ddpid 2>/dev/null" EXIT sleep 30 ### dem dd die Zeit geben ggfs. die Partition zu fuellen ### wenn das script wegen "Partition voll" beendet wird schlaeft ### sleep noch fertig. ### dd beenden, regulaeres Ende kill -TERM $ddpid ### und Schluss, zurueck zum else-Zweig im Hauptscript } #################################################################### ### Hauptscript if test "x$1" = "x--check-disk"; then ### script als "Watcher" gestartet watch_disk $2 ## $2 = pid des aufrufenden scripts, das '$$' unten else ### script wurde normal gestartet ### Watcher starten und dabei die eigene PID uebergeben $BASH $0 --check-disk $$ & watcherpid=$! ### Backup starten und dabei die PID des Watchers uebergeben run_backup $watcherpid ### Beim echten Backupscript obiges loeschen und folgendes ### entkommentieren: # ### trap zum beenden des Watcherscripts einrichten # trap "kill -TERM $watcherpid" EXIT # run_backup fi ==== Noch Fragen? ;) HTH, -dnh -- Why do you focus so much on _new_ technology? -- New is better. Is nothink old that is better than new. -- Yes there is. -- Da? Namink one then. -- The Original Pentium versus counting on your fingers. -- Da. Da. "Don't divide. Intel inside" [Sid & Pitr in userfriendly]
participants (2)
-
Andre Tann
-
David Haller