Kleines bash-backup-script

Post Reply
Message
Author
latex
Posts: 63
Joined: 28. Apr 2004 13:34

Kleines bash-backup-script

#1 Post by latex »

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

Code: Select all

#!/bin/bash
# Autor&#58; Markus Hörret <markus&#91;at&#93;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
# &#40;at your option&#41; any later version.
#
# Über eine kurze Mitteilung zu erfolgten Modifikationen, Verbesserungen oder BUG-Fixes wäre ich 
# sehr dankbar &#58;-&#41;
#
# BESCHREIBUNG
# BASH-Script zum Sichern/Spiegeln eines Verzeichnisses
# über das Netzwerk &#40;NFS&#41;
# 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 &#40;o.ä.&#41; 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&#58; 1&#41; Die Lösung mit dem checkmount-file gefällt mir noch nicht so recht, das muss auch
#          anders gehen.
#       2&#41; 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 &#40;zum autom. Mounten&#41;
  BACKUP_DEV=/dev/sda1

# Filesystemtyp des Backuplaufwerkes &#40;'L'okal&#41; &#40; ext2, ext3, reiserfs,, etc...&#41;
  FSTYPE_L=ext3

# Absoluter Pfad des zu sichernden Verzeichnisses &#40;Quellmedium&#41;
  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 &#40; nfs, smbfs, etc...&#41;  
  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"`

# ;-&#41;
  NOW=`date`

# Scriptname
  SCRIPTNAME="Simple Bash Backup Script"

# Version
  VERSION=0.5
  
# Copyright
  COPYRIGHT="&#40;c&#41; 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 &#91; -e $PROC &#93;
    then
        #Sende Email und Exit
        if &#91; $EMAIL -eq 1 &#93;
         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 &#91; ! -d $LOGDIR &#93;
    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 &#91; ! -e $PROC &#93;
    then
        #Sende Email und Exit
        if &#91; $EMAIL -eq 1 &#93;
         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 &#91; ! -e $SERVER_MP/checkmount &#93;
    then
        mount -t $FSTYPE_R -o ro $SERVER&#58;$SERVER_SHARE $SERVER_MP
   fi

# Zielvolume mounten falls nicht gemountet
   if &#91; ! -e $BACKUP_MP/checkmount &#93;
    then
       mount -t $FSTYPE_L -o rw $BACKUP_DEV $BACKUP_MP
   fi

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

# Existiert das LOG-Verzeichnis ?
   if &#91; ! -d $LOGDIR &#93;
    then
        #Sende Email und Exit
        if &#91; $EMAIL -eq 1 &#93;
         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 &#91; ! -e $BACKUP_MP/checkmount &#93;
    then
        #Sende Email und Exit
        if &#91; $EMAIL -eq 1 &#93;
         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 &#91; ! -e $SERVER_MP/checkmount &#93;
    then
        #Sende Email und Exit
        if &#91; $EMAIL -eq 1 &#93;
         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 &#40;Kopie von stdout&#41;
  exec 1>$LOGFILE             # stdout in file umleiten
  exec 2>&1                   # stderr erhalten			
  if &#91; $QUIET -eq 0 &#93; 
   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&#58; $HOSTNAME "
 echo "Startzeit&#58; $NOW"
 echo "#######################################################################"
 echo " "

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

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

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

# nur Montag bis Donnerstag 
   if &#91; $DAYOFWEEK -lt 5 &#93;
    then
	##### INCEMENTAL BACKUP #####
	# Zielverzeichnis vorhanden?
 	 if &#91; ! -d $BACKUP_DIR &#93;; then
    		 if &#91; $EMAIL -eq 1 &#93;
     	        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 | &#40; cd $BACKUP_DIR ; tar xpf - &#41; 
 fi


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

# Das Quellmedium wieder unmounten und loggen

umount $SERVER_MP

FINISH=`date`
 echo " "
 echo "#######################################################################"
 echo "Sicherung von $SERVER&#58;$SERVER_SHARE"
 echo "nach $BACKUP_DIR ist abgeschlossen."
 echo "$SERVER_MP wurde ausgehängt."
 echo "Verarbeitungsende&#58; $FINISH"
 echo "#######################################################################"
# LOG-File per email verschicken
  if &#91; $EMAIL -eq 1 &#93;
   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 &#91; $COMPRESSLOG -eq 1 &#93;
   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!

rattenkind

#2 Post by rattenkind »

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
Posts: 63
Joined: 28. Apr 2004 13:34

#3 Post by latex »

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!

AlexMH

DAR

#4 Post by AlexMH »

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

#5 Post by rattenkind »

dann schaut euch mal flexbackup an.

ratte

gast

#6 Post by gast »

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
Posts: 63
Joined: 28. Apr 2004 13:34

#7 Post by latex »

gast wrote:... 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!

gast

#8 Post by gast »

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

User avatar
killerhippy
Posts: 529
Joined: 19. May 2000 19:36
Contact:

#9 Post by killerhippy »

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: Select all

if &#91; 5 -eq "$VARNAME" &#93;
kann ich mir auch irgendwie nicht angewoehnen...
Es gibt keine dumme Fragen!

Killerhippy

Post Reply