Backup jede Woche erstellen

Rubyurek

Commander
Registriert
Sep. 2017
Beiträge
2.686
Code:
#!/bin/bash
#
#name: linux
#Version: 0.1
#Erstellt am: 06.09.2019
#Geändert am: 06.09.2019

DATE=$(date +%Y-%m-%d-%H%M%S)
BACKUP_DIR="$HOME/testfiles/backup"
SOURCE="$HOME/testfiles"


tar -cvzpf $BACKUP_DIR/backup-$DATE.tar.gz $SOURCE


if [ $BACKUP_DIR >= 7 ]
then rm backup-*.tar.gz
fi

Was der code machen soll:
  • Soll einmalig ein Ordner im testfiles erstellen mit den namen "Backup"
  • Backup erstellt mit den namen: backup_(datum dahinter)
  • Bei "if" geht es darum, wenn ich mehr als 7 backups habe soll die älteren gelöscht werden und nur die 7 neusten behalten werden.

Was mir wichtig ist, ob jemand weiss wie ich das 8 Backup automatisch lösche. zu dem möchte ich, dass nur die Dateien im Ordner testfiles ein backup kriegen. Jedoch wird der Backup Ordner im testfiles dazu gelegt im backup. Dies soll verhindert werden.
 
Zuletzt bearbeitet:
Erst mal ein Kompliment. Gut, daß Du Variablen und einen ordentlichen Programmheader verwendest.👍 Ich hasse nichts mehr, wenn man bei Kunden ist, wo die Admin-Kollegen ein Script ohne das einfach nur hinrotzen, und man gar nicht, weiß, wer wo und wann das erstellt hat, und alle variablen Angaben an zig Stellen ändert.

Weitere Tipps
  1. Verwende Returncodes, um zu prüfen, ob ein Befehl korrekt ausgeführt wurde
  2. Verwende eine Logdatei, um alle Informationen dort abzulegen, und damit weiß, was genau passiert ist
  3. Für Löschen alter Daten würde ich einfach find mit +mtime XX -delete verwenden
  4. Die Contab erzeugst Du nur einmalig auf der Kommandozeile, nicht im Programm
Ein paar Anpassungen ungetestet.
Code:
DATE=$(date +%Y-%m-%d-%H%M%S)
BACKUP_DIR="$HOME/backup"
SOURCE="$HOME/testfiles"
TARGET=$BACKUP_DIR/backup-$DATE.tar.gz
LOG=$BACKUP_DIR/backup-$DATE.log
ALTER=49

tar -cvzpf z $TARGET $SOURCE > $LOG
rc=%?

if [ $rc == 0 ];then
  echo "Backup erstellt ohne Fehler" >$LOG
else
  echo "FEHLER <$rc>: Backup abgebrochen! " >$LOG
  exit 1
fi

find $BACKUP_DIR -mtime +$ALTER -delete >$LOG
rc=%?

if [ $rc != 0 ];then
  echo "FEHLER <$rc>: Löschen alter Dateien nicht erfolgreich " >$LOG
  exit 2
fi
 
Zuletzt bearbeitet:
Im grunde ist der Code jetzt wie oben, jedoch wollte ich --exclude $BACKUP_DIR miteinbinden. Es wurde mir jedoch ein error angezeigt:

Code:
tar: The following options were used after any non-optional arguments in archive create or update mode.  These options are positional and affect only arguments that follow them.  Please, rearrange them properly.
tar: --exclude „/home/linux/testfiles/backup“ has no effect
tar: /home/linux/testfiles/backup/backup.tar.gz: Funktion write fehlgeschlagen: Datenübergabe unterbrochen (broken pipe)
tar: Child returned status 2
tar: Error is not recoverable: exiting now
 
Old Knitterhemd schrieb:
Außerdem liegt dein Zielordner im Quellordner.
Du würdest deine alten Backups wieder mit in den Backup Ordner kopieren.

Deshalb wollte ich es ja mit --exclude verhindern, dass der Ordner mitgenommen wird im Backup :) dann ploppt diese fehlermeldung raus :)
 
Code:
#!/bin/bash
#
#name: Marcus Sorek
#Version: 0.1
#Erstellt am: 06.09.2019 
#Geändert am: 06.09.2019

        DATE=$(date +%Y-%m-%d-%H%M%S)
        BACKUP_DIR="$HOME/testfiles/backup"
        SOURCE="$HOME/testfiles"

tar -cvzpf $BACKUP_DIR/backup-$DATE.tar.gz $SOURCE 
#--exclude=$BACKUP_DIR

Exclude ist auskommentiert, weil der halt nicht funktioniert.
 
Mach doch gleich ein anderes Verzeichnis, sonst sicherst Du immer zuviel und mit Fehler. Die beiden Verzeichnisse sollten immer unabhängig sein, z.B. SOURCE=$HOME/backup.

Als Schmankerl könntest Du Dir das Ergebnis noch als E-Mail schicken lassen, so daß Du immer eine Info bekommst, wie Dein Backup lief.
 
Keine Ahnung ob tar das Verzeichnis erstellt falls nicht vorhanden. Das könntest du noch abfangen mit https://wiki.ubuntuusers.de/Shell/Bash-Skripting-Guide_für_Anfänger/#Das-Test-Kommando
Also prüfen ob $BACKUP_DIR existiert und falls nicht > anlegen.

Wenn du das alles als Skript ausführst wird bei jedem Aufruf der Eintrag in der crontab erstellt, daher auch hier prüfen ob der Eintrag schon vorhanden ist, z.B. quick'n'dirty per grep auf die Crontab. Sobald der Eintrag einmalig vorhanden ist, wird es ja jede Woche ausgeführt und ich würde solche ausführbaren Skripte nicht im Home Verzeichnis ablegen sondern in /usr/local/bin oder so...

Die Prüfung bzw. Löschung alter Backups würde ich anders realisieren denn so vergleichst du einen String mit einer Zahl und würdest dann alle Backups löschen. Auch musst du wenn den Pfad komplett angeben da er sonst da sucht wo das Script liegt, also in $HOME/testfiles/.
Du könntest das z.B. so lösen: https://www.ostechnix.com/find-delete-oldest-file-x-files-directory/ oder dich hier lang orientieren https://superuser.com/questions/268344/how-do-i-delete-all-but-10-newest-files-in-linux.
Da gibt es verschiedene Möglichkeiten.
 
  • Gefällt mir
Reaktionen: Old Knitterhemd
Old Knitterhemd schrieb:
Code:
tar -cvzpf $BACKUP_DIR/backup-$DATE.tar.gz --exclude=$BACKUP_DIR $SOURCE

Wenn eher so rum aber ich würde den Ordner auch da raus holen.

Vielen dank! Der Tausch, dass $SOURCE am ende stehen muss funktioniert!
 
Zurück
Oben