Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
Kleines bash-backup-script

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - Allgemein
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
latex



Anmeldungsdatum: 28.04.2004
Beiträge: 63

BeitragVerfasst am: 21. Aug 2005 17:46   Titel: Kleines bash-backup-script

Hi Leute,
ein Bekannter von mir hat folgendes, kleines Script geschrieben. Vielleicht kann es ja jemand gebrauchen.
Viel Spaß damit Smile
Gruß latex


Code:
#!/bin/bash
# Autor: Markus Hörret <markus[at]hoerret.com>
#
# Dies ist ein freies und kostenloses Script; es darf weiterverbreitet und/oder modifiziert werden,
# solange die Bedingungen der GNU General Pulic License, wie sie von der Free Software Foundation
# herausgegeben wird, eingehalten werden. 
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# Über eine kurze Mitteilung zu erfolgten Modifikationen, Verbesserungen oder BUG-Fixes wäre ich
# sehr dankbar :-)
#
# BESCHREIBUNG
# BASH-Script zum Sichern/Spiegeln eines Verzeichnisses
# über das Netzwerk (NFS)
# Version 0.5 vom 04.August 2005
#
# In den Quell und Zielvolumes muß eine Datei mit Namen "checkmount"
# erstellt werden, damit dieses Script überprüfen kann, ob die Volumes gemountet/verfügbar sind.
# Ein Verzeichnis namens /var/log/backup wird, falls nicht vorhanden, angelegt.
# Das Script soll über cron (o.ä.) automatisch von mo-fr starten. Es findet selbstständig heraus,
# welcher Tag ist und macht mo-do eine incrementelle Sicherung und am fr eine Vollsicherung
#
# TODO: 1) Die Lösung mit dem checkmount-file gefällt mir noch nicht so recht, das muss auch
#          anders gehen.
#       2) Evtl kann ich auch ein echtes PID File verwenden oder ps ...statt $PROC
#################################################################################################
#################################################################################################
#################################################################################################

#=============================================#
#            Benutzerdefinierte Variablen     #
#=============================================#

# Wo soll das BACKUP erstellt werden?
  BACKUP_DIR=/mnt/easyraid/backup

# Mountpoint des Backuplaufwerks
  BACKUP_MP=/mnt/easyraid

# Device des physischen Backupvolumes (zum autom. Mounten)
  BACKUP_DEV=/dev/sda1

# Filesystemtyp des Backuplaufwerkes ('L'okal) ( ext2, ext3, reiserfs,, etc...)
  FSTYPE_L=ext3

# Absoluter Pfad des zu sichernden Verzeichnisses (Quellmedium)
  FILESYSTEMS=/mnt/sunfire/0*

# Mountpoint der Quelle
  SERVER_MP=/mnt/sunfire

# Quellrechner und Quellverzeichnis
  SERVER=192.168.0.111
  SERVER_SHARE=/export/raid5_850

# Filesystemtyp des zu sichernden Mediums ( nfs, smbfs, etc...) 
  FSTYPE_R=nfs

# LOG Verzeichnis
  LOGDIR=/var/log/backup
 
# Logfile
  LOGFILE=$LOGDIR/`date +"%Y%m%d_%H%M"`.log

# Emailbenachrichtigung?  0=false, 1=true
  EMAIL=0

# EMAIL-Adresse des Empfängers
  EMAILADDRESS=root@localhost

# Email Betreff
  EMAILSUBJECT="$HOSTNAME SICHERUNG"

# Soll das LOG-File am Schluß komprimiert verden?  0=false, 1=true
  COMPRESSLOG=0

# Wenn JA, mit welcher Komprimierungsstufe?
  COMPRESSLEVEL=6

# Soll eine Bildschirmausgabe erfolgen? LOG-File wird auf jeden Fall aktualisiert   0=false, 1=true
  QUIET=1

# Datum der letzten Vollsicherung an Variable übergeben
  LASTFULL=$LOGDIR/lastfullbackupdate

#################################################################################################
#+------------------------------------+     
#| AB HIER MÖGLICHST NICHTS VERÄNDERN!|
#+------------------------------------+
#################################################################################################

#=============================================#
#  Applikations-Variablen -  NICHT EDITIEREN  #
#=============================================#

# Wochentag;
  DAYOFWEEK=`date +"%w"`

# ;-)
  NOW=`date`

# Scriptname
  SCRIPTNAME="Simple Bash Backup Script"

# Version
  VERSION=0.5
 
# Copyright
  COPYRIGHT="(c) 2005 Markus Hörret --- GNU GPL"

# PROC Variable zum Überprüfen, ob das vorherige Script fertig ist
  PROC=$LOGDIR/run

#=============================================#
# PROC und LOG überprüfen/erstellen           #
#=============================================#

# Läuft eine weitere Instanz dieses Scriptes?
   if [ -e $PROC ]
    then
        #Sende Email und Exit
        if [ $EMAIL -eq 1 ]
         then
            echo "Es darf nur eine Instanz des Programmes gestartet werden. Operation abgebrochen." | mail -s "$EMAILSUBJECT" $EMAILADDRESS
        fi
         echo "Es darf nur eine Instanz des Programmes gestartet werden. Operation abgebrochen."
         exit 1
   fi
   
# LOGDIR erstellen falls nötig   
   if [ ! -d $LOGDIR ]
    then
         mkdir $LOGDIR; echo "1970-01-01">$LASTFULL ;
   
   fi
   
# Datum der letzten Vollsicherung für inkrementelles Backup
  LASTFULL_I=`cat $LASTFULL`

# PROC erstellen
touch $PROC

# Wurde PROC korrekt erstellt?
   if [ ! -e $PROC ]
    then
        #Sende Email und Exit
        if [ $EMAIL -eq 1 ]
         then
            echo "Das Statusfile $PROC konnte nicht erstellt werden. Operation abgebrochen." | mail -s "$EMAILSUBJECT" $EMAILADDRESS
        fi
         echo "Das Statusfile $PROC konnte nicht erstellt werden. Operation abgebrochen."
         exit 1
   fi

#=============================================#
#    Ziel und Quelle mounten              #
#=============================================#

# Quellvolume mounten falls nicht gemountet
   if [ ! -e $SERVER_MP/checkmount ]
    then
        mount -t $FSTYPE_R -o ro $SERVER:$SERVER_SHARE $SERVER_MP
   fi

# Zielvolume mounten falls nicht gemountet
   if [ ! -e $BACKUP_MP/checkmount ]
    then
       mount -t $FSTYPE_L -o rw $BACKUP_DEV $BACKUP_MP
   fi

#=============================================#
#    Fehlerprüfung               #
#=============================================#

# Existiert das LOG-Verzeichnis ?
   if [ ! -d $LOGDIR ]
    then
        #Sende Email und Exit
        if [ $EMAIL -eq 1 ]
         then
            echo "Das LOG-Verzeichnis $LOGDIR existiert nicht und kann nicht erstellt werden. Operation abgebrochen." | mail -s "$EMAILSUBJECT" $EMAILADDRESS
        fi
         echo "Das LOG-Verzeichnis $LOGDIR existiert nicht und kann nicht erstellt werden. Operation abgebrochen."; rm -f $PROC
         exit 1
   fi

# Existiert das Backupverzeichnis und ist das Volume gemountet?
   if [ ! -e $BACKUP_MP/checkmount ]
    then
        #Sende Email und Exit
        if [ $EMAIL -eq 1 ]
         then
            echo "Das angegebene Zielvolume $BACKUP_MP ist nicht gemountet. Operation abgebrochen." | mail -s "$EMAILSUBJECT" $EMAILADDRESS
        fi
         echo "Das angegebene Zielvolume $BACKUP_MP ist nicht gemountet. Operation abgebrochen." ; rm -f $PROC
         exit 1
   fi

# Ist das Quellverzeichnis gemountet
   if [ ! -e $SERVER_MP/checkmount ]
    then
        #Sende Email und Exit
        if [ $EMAIL -eq 1 ]
         then
            echo "Das angegebene Quellvolume $SERVER_MP ist nicht gemountet. Operation abgebrochen." | mail -s "$EMAILSUBJECT" $EMAILADDRESS
        fi
         echo "Das angegebene Quellvolume $SERVER_MP ist nicht gemountet. Operation abgebrochen."; rm -f $PROC
         exit 1
    fi

#################################################################################################

#=============================================#
# Ausgabe an Bildschirm und LOG-File schicken #
#=============================================#

  exec 3>&1                   # pipe erstellen (Kopie von stdout)
  exec 1>$LOGFILE             # stdout in file umleiten
  exec 2>&1                   # stderr erhalten         
  if [ $QUIET -eq 0 ]
   then
       tail -f $LOGFILE >&3 &     # tail im Hintergrund mitlaufen lassen
  fi

#################################################################################################

#=============================================#
#      EIN BISSCHEN AUSGABE ERSTELLEN         #
#=============================================#

 echo " "
 echo "#######################################################################"
 echo "$SCRIPTNAME "
 echo "Version $VERSION  $COPYRIGHT"
 echo "$COPYRIGHT"
 echo "Host: $HOSTNAME "
 echo "Startzeit: $NOW"
 echo "#######################################################################"
 echo " "

#=============================================#
#   BACKUP STARTEN               #
#=============================================#

# AUSFÜHRUNG
# Nur Freitags
   if [ $DAYOFWEEK -eq 5 ]
    then
   ##### FULLBACKUP #####
   # Datum der letzten Vollsicherung für incrementelle Sicherung festhalten
     date +"%F">$LASTFULL

   # Altes Zielverzeichnis löschen, um Platz zu gewinnen
     if [ -d $BACKUP_DIR ]
      then
            rm -Rf $BACKUP_DIR > /dev/null 2>&1
     fi
   # Neues Zielverzeichnis erstellen
     if [ ! -d $BACKUP_DIR ]
      then
            mkdir $BACKUP_DIR
     fi
   # Jetzt dauerts...
    tar --ignore-failed-read -cpf - $FILESYSTEMS | ( cd $BACKUP_DIR ; tar xpf - )
 fi

# nur Montag bis Donnerstag
   if [ $DAYOFWEEK -lt 5 ]
    then
   ##### INCEMENTAL BACKUP #####
   # Zielverzeichnis vorhanden?
     if [ ! -d $BACKUP_DIR ]; then
           if [ $EMAIL -eq 1 ]
                then
          echo "Das angegebene Zielvolume $BACKUP_DIR ist nicht vorhanden. Operation abgebrochen." | mail -s "$EMAILSUBJECT" $EMAILADDRESS
          fi
            echo "Das angegebene Zielvolume $BACKUP_MP ist nicht gemountet. Operation abgebrochen."
         exit 1
     fi
   # incrementelle Sicherung mit TAR
   tar --ignore-failed-read -N $LASTFULL_I -cpf - $FILESYSTEMS | ( cd $BACKUP_DIR ; tar xpf - )
 fi


#################################################################################################

# Das Quellmedium wieder unmounten und loggen

umount $SERVER_MP

FINISH=`date`
 echo " "
 echo "#######################################################################"
 echo "Sicherung von $SERVER:$SERVER_SHARE"
 echo "nach $BACKUP_DIR ist abgeschlossen."
 echo "$SERVER_MP wurde ausgehängt."
 echo "Verarbeitungsende: $FINISH"
 echo "#######################################################################"
# LOG-File per email verschicken
  if [ $EMAIL -eq 1 ]
   then cat $LOGFILE | mail -s "$EMAILSUBJECT" $EMAILADDRESS
  fi
# stdout und stderr sollen auf die console gehen anstatt zum LOG-File,
# weil das logfile komprimiert werden soll
 exec 1>&3                   
 exec 2>&3
#LOG-File komprimieren?
  if [ $COMPRESSLOG -eq 1 ]
   then
      #gzip it
      gzip -$COMPRESSLEVEL $LOGFILE  > /dev/null 2>&1
      rm -f $LOGFILE  > /dev/null 2>&1
  fi

# Prozessstatus löschen
rm -f $PROC

#=============================================#
#   SCRIPTENDE                         #
#=============================================#

exit 0


_________________
Erst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du!
 
Benutzer-Profile anzeigen Private Nachricht senden

rattenkind
Gast





BeitragVerfasst am: 28. Aug 2005 11:58   Titel:

Hi,

zwei Anmerkungen:

Scriptgesteuertes Loeschen ist gefährlich.

tar als Backuptool ist nicht die Loesung fuer alles.
- spare files sind problematisch
- ist das Archiv beschaedigt, sind alle Dateien verloren

Es laesst sich aber gut lesen und ist fuer Anfaenger vermutlich eine gute Vorlage.

ratte
 

latex



Anmeldungsdatum: 28.04.2004
Beiträge: 63

BeitragVerfasst am: 28. Aug 2005 12:17   Titel:

Danke für diese Kritik, mal mit meinem Bekannten grübeln, wie es anders gehen könnte um diese zwei Feinheiten zu verbessern.
Gruß
latex
_________________
Erst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du!
 
Benutzer-Profile anzeigen Private Nachricht senden

AlexMH
Gast





BeitragVerfasst am: 29. Aug 2005 11:59   Titel: DAR

Hi,

sehr komfortabel fuer Backups ist auch der disk archiver "dar" (http://dar.linux.free.fr/). Dafuer gibt's auch eine Oberflaeche "kdar" mit der man Backup Profile anlegen kann. Sehr praktisch das ganze.

Gruss,
Alex
 

rattenkind
Gast





BeitragVerfasst am: 29. Aug 2005 22:15   Titel:

dann schaut euch mal flexbackup an.

ratte
 

gast
Gast





BeitragVerfasst am: 03. Sep 2005 0:14   Titel:

gerade fuer anfaenger eine scheiss-vorlage, weil kaum eine variable ist gequotet, scheint aber bei linux mode zu sein. einige -- nach programmoptionen schaden auch nicht.
es soll ja wohl noch funktionieren, wenn die sektion Benutzerdefinierte Variablen individuellen beduerfnissen angepasst wird.

ja und die uhr bleibt zwischen den date-aufrufen auch nicht stehen.

lustig finde ich auch, wenn freitags _erst_ das alte full-backup geloescht wird. ja ja, platz gewinnen geht vor sicherheit.

thunderbird loescht auch imap-mails (abholen o.k.), obwohl er sie lokal evtl. nicht ablegen kann (z.b. keine schreibrechte im lokalen verzeichnis), ist natuerlich kein murX, laeuft ja auch unter DosXP u. osX. nur mal so, als beispiel fuer sicheres programmieren.

trotzdem, lob fuers engagement!


Udo Maslo
 

latex



Anmeldungsdatum: 28.04.2004
Beiträge: 63

BeitragVerfasst am: 04. Sep 2005 0:27   Titel:

gast hat folgendes geschrieben::
... gerade fuer anfaenger eine scheiss-vorlage, weil kaum eine variable ist gequotet, scheint aber bei linux mode zu sein...
Udo Maslo

Ziemlich unfreundlich und beleidigend, scheint aber bei manchen Menschen Mode zu sein...
Darüber hinaus ist dieses Script für einen speziellen Einsatz gedacht und auf diesen zugeschnitten, und ja, das löschen muss sein aus Platzgründen...
Alles in allem fühle ich mich (obwohl das script nicht von mir ist) von diesem Post einfach nur beleidigt!
Aber trotzdem, ganz dickes lob für dein engagement hier...
_________________
Erst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du!
 
Benutzer-Profile anzeigen Private Nachricht senden

gast
Gast





BeitragVerfasst am: 08. Sep 2005 0:49   Titel:

Ja, wohl etwas derb ausgedrueckt.
Unix-Dateisysteme konnten schon lange vor Dos95 ordentliche Dateinamen beherbergen, nur viele Programme und noch mehr Scripte koennen leider bis heute nicht damit umgehen. Da lachen doch die in Redmond. Versuch doch mal ein:

rpm -i "irgendwo/Eigene Dateien/IrgendEin.rpm"

Ergebnis etwa:
error: open of Eigene failed: No such file or directory
error: open of Dateien/perl-DBI-1.47-3.x86_64.rpm failed: No such file or directory

Ist doch schon nicht mehr zum auslachen, sondern einfach nur peinlich! Wie soll man damit gewinnen!?

Udo Maslo
 

killerhippy



Anmeldungsdatum: 19.05.2000
Beiträge: 529

BeitragVerfasst am: 08. Sep 2005 22:26   Titel:

Ich muss ja zugeben, dass mir das fehlende Quting nicht aufgefallen war, da hat der Gast recht, wenn auch seine Ausdrucksweise trollig ist...

BTW:
Code:
if [ 5 -eq "$VARNAME" ]
kann ich mir auch irgendwie nicht angewoehnen...
_________________
Es gibt keine dumme Fragen!

Killerhippy
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - Allgemein Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy