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