30.10.2024, 20:58 UhrDeutsch | English
Hallo Gast [ Registrierung | Anmelden ]

Backupscript


Da ich immer wieder mal Dateien sichern muss, aber nicht immer einen Fullback erstellen möchte, habe ich mir ein Script geschrieben, das genau dies erledigt.
Das unten gelistete Shellscript erstellt ein gepacktes tar-Archiv (*.tar.gz) von einen per Parameter übergebenen Verzeichnis. Mittels einer Referenzdatei kann beeinflusst werden ab welchen Datum die Dateien gesichert werden. Den Namen der Referenzdatei kann mit der Variablen REFERENZDATEI bestimmen. Der find-Befehl im Script benützt den Zeitstempel dieser Referenzdatei um das angegebene Verzeichnis mit den Dateien die jüngeren oder gleichen Datums sind zu archivieren.

Das heisst, man kann auch noch nachträglich alle Dateien ab einen bestimmten Datum sichern. Zuerst legt man mit touch die Datei an.

bluelupo@skywalker:~$ touch referenz.txt
bluelupo@skywalker:~$ ls -ld referenz.txt
-rw-r--r--  1 bluelupo users 0 2005-04-22 18:10 referenz.txt


Jetzt setzt man ebenfalls mit touch Kommando noch den gewünschten Zeitstempel ab dem man sichern will. Angenommen wir haben aktuell den 22.04.2005 und wollen ab 21.04.2005 19:30Uhr sichern, dann erstellt man den Zeitstempel so.

bluelupo@skywalker:~$ touch -t 04211930 referenz.txt
bluelupo@skywalker:~$ ls -ld referenz.txt
-rw-r--r--  1 bluelupo users 0 2005-04-21 19:30 referenz.txt


Nun können wir dem Script mybackup.sh einen Backup anstossen. Wir wollen unterhalb des HOME-Verzeichnisses ein Directory namens mydata mit all seinen Dateien die jünger bzw. gleich alt sind als der Zeitstempel der Referenzdatei sichern (21.04.2005 19:30 Uhr).

bluelupo@skywalker:~$ ./mybackup.sh arch ./mydata


Der erste Paramter benennt den Archivnamen der zweite den Verzeichnisnamen ab dem gesichert werden soll. Wir sehen es ist ein Archiv entstanden mit dem Namen arch-20050422-194735.tar.gz. Der Name setzt sich zusammen aus dem angegebenen Parameter arch einen Zeitstempel in dem Format YYMMDD-HHMMSS und dem Postfix .tar.gz. Das hat den Vorteil das ein evtl. vorhandenes Archiv mit selbigen Namen nicht überschrieben werden kann da es einen unterschiedlichen Zeitstempel im Dateinamen führt.

-rw-r--r--  1 bluelupo users 238 2005-04-22 19:47 arch-20050422-194735.tar.gz


Zur Kontrolle des Inhalts müssen wir komprimierte Archiv erst unzipen mit

bluelupo@skywalker:~$ gzip -d arch-20050422-194735.tar.gz


Kleine Anmerkung: Man kann ebenso gunzip arch-20050422-194735.tar.gz verwenden. Jetzt können wir das den Inhalt des tar-Archiv betrachten

bluelupo@skywalker:~$ tar -tvf arch-20050422-194735.tar
-rw-r--r-- bluelupo/users     0 2005-04-22 18:24:16 ./mydata/verz1/datei11
-rw-r--r-- bluelupo/users     0 2005-04-22 18:24:17 ./mydata/verz1/datei12
-rw-r--r-- bluelupo/users     0 2005-04-22 18:24:18 ./mydata/verz1/datei13
-rw-r--r-- bluelupo/users     0 2005-04-22 18:23:34 ./mydata/datei1
-rw-r--r-- bluelupo/users     0 2005-04-22 18:23:35 ./mydata/datei2
-rw-r--r-- bluelupo/users     0 2005-04-22 18:23:37 ./mydata/datei3


Kleine Anmerkung:
Es geht auch einfacher:
tar tvzf arch-20050422-194735.tar.gz

leistet dasselbe in einem Arbeitsschritt
'
Wenn wir nun zum Test im Verzeichnis mydata weitere Dateien anlegen und das Script mybackup.sh mit den gleichen Parametern nochmals ausführen sehen das nur die neu hinzugekommenen Dateien gesichert worden sind.

Listing des Scripts mybackup.sh


#!/bin/bash
#
# Script mybackup.sh
#
# Variablen definieren
ZEITSTEMPEL=`date '+%Y%m%d-%H%M%S'`
ARCHIVNAME=$1
BACKUPPFAD=$2
REFERENZDATEI=./referenz.txt

#Funktion checktar
checktar()
{
RC=$1
if [ $RC -eq 0 ]; then
        # alte Referenzdatei löschen aber nur wenn vorheriger tar erfolgreich war (Returncode 0)
        if [ -f $REFERENZDATEI ]; then
                rm $REFERENZDATEI
        fi
        # Referenzdatei anlegen
        touch $REFERENZDATEI

        # nur bei vorhanden tar-Archiv komprimieren 
        if [ -f $ARCHIVNAME-$ZEITSTEMPEL.tar ]; then
                gzip $ARCHIVNAME-$ZEITSTEMPEL.tar
        fi

# wenn tar nicht erfolreich war Fehlermeldung (Returncode ungleich 0) ausgeben
elif [ $RC -ne 0 ]; then
        echo "Fehler beim Erzeugen des Archivs $ARCHIVNAME-$ZEITSTEMPEL.tar"
fi
}

### Hauptprogramm ###
if [ $# -ne 2 ]; then
        echo ""
        echo "Syntax:   $0 <archiv_name> <backup_verzeichniss>"
        echo "Beispiel: $0 archiv $HOME/daten"
        echo ""
        exit 1
fi

# wenn Referenzdatei vorhanden dann Dateien sichern die jünger sind als der Zeitstempel der Referenzdatei ansonsten Fullbackup
if [ -f $REFERENZDATEI ]; then
        # hier werden nur Dateien (type f) archiviert die neuer als der Timestamp der Referenzdatei sind
        # Ohne type f gehts nicht da der TS des Verzeichnisses auch angepasst wird wenn ein Schreibzugriff
        # unterhalb dieser Ebene stattfindet. Vorsicht leere Verzeichnisse werden nicht mit gesichert.
        # Option -r beim tar Befehl hängt die gefundenen Dateien ans Archiv an
        find $BACKUPPFAD -type f -cnewer $REFERENZDATEI -exec tar -rf $ARCHIVNAME-$ZEITSTEMPEL.tar {} \;
        TAR_RC=$?
        checktar $TAR_RC
else
        tar -cf $ARCHIVNAME-$ZEITSTEMPEL.tar $BACKUPPFAD
        TAR_RC=$?
        checktar $TAR_RC
fi

exit 0



zurück
XML Revisions of $tag
Seiten-History :: Letzter Editor : Zatuffli :: Eigentümer : BlueLupo ::
Powered by pnWikka 1.0
 
 
Deutsch | English
Logos and trademarks are the property of their respective owners, comments are property of their posters, the rest is © 2004 - 2006 by Jörg Schirottke (Kano).
Consult Impressum and Legal Terms for details. Kanotix is Free Software released under the GNU/GPL license.
This CMS is powered by PostNuke, all themes used at this site are released under the GNU/GPL license. designed and hosted by w3you. Our web server is running on Kanotix64-2006.