![](https://seccdn.libravatar.org/avatar/1cf53bbe68141b5c35a0b6ed309cf54b.jpg?s=120&d=mm&r=g)
Dieter Lukas, Freitag 03 April 2009:
Dein Skript interessiert mich sehr. Bitte schicken.
Here we go: ===schnipp #!/bin/bash # Wohin soll geloggt werden? LOG="/bin/logger -t backup-daily" LOG_FILE="/home/andre/.local/share/Trash/files/$(date +"%y%m%d-%H%M")-backup-daily.log" # Auf welches lokale Ziel soll gebackupt werden? TARGET_LCL="/backup/local" # In welchem Verzeichnis wird das Backup-Medium eingehaengt? # Normalerweise ist dies dasselbe Verzeichnis wie das # lokale Backup-Ziel. # Auf BACKUP_MOUNTPOINT wird geprueft, ob noch genuegend Speicherplatz # zur Verfuegung steht. BACKUP_MOUNTPOINT="$TARGET_LCL" # Welche Verzeichnisse sollen gebackupt werden, welche nicht? DIRS_TO_BACKUP="/home /etc /boot /usr/local" EXCLUDES="/home/*/.beagle" # Binaries... (koennten noch besser definiert werden...) RSYNC="$(which rsync)" DU="$(which du)" ### ### Ab hier keine Variablendefinitionen mehr... ### echo "Now starting daily backup..." | $LOG # Logdatei anlegen und fuer alle lesbar machen: date > $LOG_FILE chmod 644 $LOG_FILE ############################## ### Lokales Backup ### ### ### ############################## # --- Lokale Backup-Partition mounten und die Namen feststellen ---> mount $TARGET_LCL 2>&1 | $LOG # Wir loeschen solange alte Verzeichnisse, bis der verfuegbare # Platz mindestens dem Volumen der Nutzlast entspricht. # Speicherplatzbedarf ermitteln: SPACE_DATA="$($DU -cs $DIRS_TO_BACKUP | tail -1 | awk '{print $1}')" SPACE_BACKUP_FREE="$(df | grep $BACKUP_MOUNTPOINT | awk '{print $4}')" # Jetzt loeschen... 10 MB sollen frei bleiben, sicherheitshalber while test $(($SPACE_DATA + 10000000)) -ge $SPACE_BACKUP_FREE; do echo "wir loeschen jetzt $TARGET_LCL/$(ls -1 $TARGET_LCL | grep -v "\." | head -n 1)" rm -rf "$TARGET_LCL/$(ls -1 $TARGET_LCL | grep -v "\." | head -n 1)" SPACE_BACKUP_FREE="$(df | grep $BACKUP_MOUNTPOINT | awk '{print $4}')" done # Wohin wollen wir die aktuelle Sicherung linken? PRIOR_DIR="$TARGET_LCL/$(ls -1 $TARGET_LCL | grep -v "\." | tail -n 1)" # Das Verzeichnis, in welches dieser Sicherungslauf # geschrieben wird. DEST_DIR="$TARGET_LCL/$(date +"%y%m%d%H%M")" mkdir "$DEST_DIR" # --- Backup auf lokales Backup-Medium ---> for SOURCE_DIR in $DIRS_TO_BACKUP; do echo "Now backing up $SOURCE_DIR to $DESTDIR" | $LOG rsync -axv --delete \ --exclude="$EXCLUDES" --delete-excluded\ --link-dest="$PRIOR_DIR" \ "$SOURCE_DIR" "$DEST_DIR" \ 2>&1 >> $LOG_FILE | $LOG RSYNC_RESULT="$?" echo "After backing up $SOURCE_DIR to $DESTDIR rsync returned $RSYNC_RESULT" | $LOG done umount $TARGET_LCL echo "Daily backup is now exiting." | $LOG exit ===schnapp So, das wars erstmal. Folgendes muß man beachten: In der Zielpartition muß immer mindestens ein Verzeichnis existieren, welches bei einem ls -1 weiter oben einsortiert wird als dasjenige, welches das Skript anlegen will. Das ist normalerweise immer der Fall, wenn man das Skript einfach täglich laufen läßt. Nur beim allerersten Lauf legt man mit mkdir /backup/local/000000 ein solches Dummyverzeichnis an. Gibt es dieses Verzeichnis nicht, so kriegt das Skript Schluckauf. Bitte unbedingt das Skript mal kurz durchgehen. Bei mir läuft es auf einigen Servern einwandfrei seit längerem. Aber die Fehlerbehandlung usw. ist natürlich nicht optimal, wenn irgend ein Binary (rsync zB) fehlt. Außerdem wird nicht geprüft, ob die Nutzlast vielleicht größer ist als die Backup-Partition überhaupt an Platz bietet. Dann geht's natürlich auch in die Hose. Das Skript liegt in /etc/cron.daily, läuft also als root. Bei Rückfragen einfach melden. Und für Verbesserungsvorschläge bin ich natürlich auch offen ;) -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org