Es ist ein Errorreporting drin, wenn Fehler im Errorlog stehen werden die gemailt.
Die Logfiles werden jetzt gespeichert und nicht jeden Tag überschrieben, ich kann also nachsehen was an einem Tag gebackupt wurde.
Und es wird nachgesehen wie voll die Platte ist und ab 90% gibts da auch eine Warnung.
Ergo: Ich kann das Script vergessen, weil es mich erinnert wenn was nicht tut.
Backup-Shellscripte
-
- Programmierung
-
toby -
24. April 2007 um 11:30
-
-
Bash
Alles anzeigen#!/bin/bash ##### Configuration Variables ##### MODE=tar #tar or rsync BACKUP_DIR=/mnt/backup #Must be local FILESYSTEMS="root@server1:/var;/etc user@server2:/var;/etc" KEEP_DAYS=45 KEEP_FULL_DAY=15 COMPRESSLEVEL=3 SILENT=true EMAIL_LOG=true EMAIL_ERR=true EMAIL_ADDRESS="mail@adress" EMAIL_SUBJECT="$HOSTNAME Backup:" SSH_ID_FILE=/root/.ssh/id_rsa ######################################### FORMAT_DATE=%Y_%m_%d FORMAT_DELIMITER=- FORMAT_TIME=%H_%M ########################################## ##### End of configuration variables ##### ##### DO NOT EDIT BELOW ##### ########################################## ## setting internal variables ## export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11" dat=`date +$FORMAT_DATE$FORMAT_DELIMITER$FORMAT_TIME`; removedat=`date --date="-$KEEP_DAYS days" +$FORMAT_DATE`; dat_keep_full_format=`echo $FORMAT_DATE | sed -e s/%d/$KEEP_FULL_DAY/g` nottoremove=`date --date="last month" +$dat_keep_full_format`; if [ -n SSH_ID_FILE ] then SSHID="-i $SSH_ID_FILE" fi ##### FUNCTIONS ##### function tar_inc { #echo "tar_inc" TARGET=$1 FILESYSTEMS=$2 DATE=$3 LASTRUN=$4 for fs in $FILESYSTEMS do username=`echo $fs|cut -f1 -d":"|cut -f1 -d"@"` servername=`echo $fs|cut -f1 -d":"|cut -f2 -d"@"` sources=`echo $fs|cut -f2 -d":"|sed -e "s/;/ /g"` mkdir -p $TARGET/$servername/$DATE scp $SSHID $TARGET/$servername/$LASTRUN/$LASTRUN.digest $username@$servername:/tmp/$servername-$$.digest ssh $SSHID $username@$servername "tar -c -g /tmp/$servername-$$.digest --verbose $sources 2>/tmp/$$.log|gzip -cf -$COMPRESSLEVEL --verbose 2>>/tmp/$$.log" > $TARGET/$servername/$DATE/$DATE.tar.gz ssh $SSHID $username@$servername cat /tmp/$$.log scp $SSHID $username@$servername:/tmp/$servername-$$.digest $TARGET/$servername/$DATE/$DATE.digest ssh $SSHID $username@$servername "rm -f /tmp/$servername-$$.digest;rm -f /tmp/$$.log" done } function tar_full { #echo "tar_full" TARGET=$1 FILESYSTEMS=$2 DATE=$3 #echo \$TARGET: $TARGET #echo \$FILESYSTEMS: $FILESYSTEMS #echo \$DATE: $DATE for fs in $FILESYSTEMS do username=`echo $fs|cut -f1 -d":"|cut -f1 -d"@"` servername=`echo $fs|cut -f1 -d":"|cut -f2 -d"@"` sources=`echo $fs|cut -f2 -d":"|sed -e "s/;/ /g"` mkdir -p $TARGET/$servername/$DATE ssh $SSHID $username@$servername rm -f /tmp/$servername-$$.digest ssh $SSHID $username@$servername "tar -c -g /tmp/$servername-$$.digest --verbose $sources 2>/tmp/$$.log|gzip -cf -$COMPRESSLEVEL --verbose 2>>/tmp/$$.log" > $TARGET/$servername/$DATE/$DATE.tar.gz ssh $SSHID $username@$servername cat /tmp/$$.log scp $SSHID $username@$servername:/tmp/$servername-$$.digest $TARGET/$servername/$DATE/$DATE.digest ssh $SSHID $username@$servername "rm -f /tmp/$servername-$$.digest;rm -f /tmp/$$.log" touch $TARGET/$servername/$DATE/fullbackup done } function tidy { #echo "tidy" BACKUP_DIR=$1 DATE=$2 REMOVE_DATE=$3 KEEP_DATE=$4 #echo \$BACKUP_DIR: $1 #echo \$DATE: $2 #echo \$REMOVE_DATE: $3 #echo \$KEEP_DATE: $4 for d in `ls $BACKUP_DIR` do if [ -d "$BACKUP_DIR/$d" ] then if [ -z $bakdirs ] then bakdirs=$d else bakdirs="$bakdirs $d" fi fi done for servername in $bakdirs do if [ "$KEEP_DATE" != "$REMOVE_DATE" ] then dirs=`ls -d "$BACKUP_DIR/$servername/$REMOVE_DATE$FORMAT_DELIMITERabc"* 2>/dev/null` if [ -n "$dirs" ] then for rdir in $dirs do if [ -d "$rdir" ] then #rm -rf $rdir echo "deleted dir: $rdir" fi done #else #echo "Nothing to tidy up for $servername" fi fi done } function rsync_inc { #echo "rsync_inc" TARGET=$1 FILESYSTEMS=$2 DATE=$3 LASTRUN=$4 for fs in $FILESYSTEMS do username=`echo $fs|cut -f1 -d":"|cut -f1 -d"@"` servername=`echo $fs|cut -f1 -d":"|cut -f2 -d"@"` sources=`echo $fs|cut -f2 -d":"|sed -e "s/;/ /g"` cp -la $TARGET/$servername/$LASTRUN $TARGET/$servername/$DATE for source in $sources do rsync -e "ssh $SSHID" \ --archive \ --verbose \ --stats \ --hard-links \ --sparse \ --numeric-ids \ --delete \ --force \ --delete-excluded \ $username@$servername:$source \ $TARGET/$servername/$DATE/`dirname $source` done done } function rsync_full { #echo "rsync_full" TARGET=$1 FILESYSTEMS=$2 DATE=$3 for fs in $FILESYSTEMS do username=`echo $fs|cut -f1 -d":"|cut -f1 -d"@"` servername=`echo $fs|cut -f1 -d":"|cut -f2 -d"@"` sources=`echo $fs|cut -f2 -d":"|sed -e "s/;/ /g"` mkdir -p $TARGET/$servername/$DATE for source in $sources do mkdir -p $TARGET/$servername/$DATE/`dirname $source` rsync -Havxe "ssh $SSHID" \ --numeric-ids \ --delete \ --force \ $username@$servername:$source \ $TARGET/$servername/$DATE/`dirname $source` done done } #function rsync_tidy #{ echo "rsync_tidy" #} ##### MAIN ##### if [ ! -d $BACKUP_DIR ] then echo ERROR: $BACKUP_DIR does not exist! >&2 exit 1 fi exec 1>$BACKUP_DIR/backup.log exec 2>$BACKUP_DIR/backup.err if [ -f "$BACKUP_DIR/lastbackup" ] then lastrun=`cat $BACKUP_DIR/lastbackup` while [ "$lastrun" = "$dat" ] do dat=`date +$FORMAT_DATE$FORMAT_DELIMITER$FORMAT_TIME`; echo -n . sleep 1 done echo #echo \$lastrun: $lastrun #if [ -d "$BACKUP_DIR/$lastrun" ] #then if [ "$MODE" = "tar" ] then if [ "$nottoremove" = "$dat" ] then tar_full "$BACKUP_DIR" "$FILESYSTEMS" "$dat" else tar_inc "$BACKUP_DIR" "$FILESYSTEMS" "$dat" "$lastrun" fi tidy "$BACKUP_DIR" "$dat" "$removedat" "$nottoremove" elif [ "$MODE" = "rsync" ] then rsync_inc "$BACKUP_DIR" "$FILESYSTEMS" "$dat" "$lastrun" tidy "$BACKUP_DIR" "$dat" "$removedat" "$nottoremove" else echo "ERROR: Unknown MODE!" >&2 exit 2 fi echo $dat > $BACKUP_DIR/lastbackup sync #fi else #No Backup ran echo "$BACKUP_DIR/lastbackup not found" echo "Starting inital backup..." if [ "$MODE" = "tar" ] then tar_full "$BACKUP_DIR" "$FILESYSTEMS" "$dat" elif [ "$MODE" = "rsync" ] then rsync_full "$BACKUP_DIR" "$FILESYSTEMS" "$dat" else echo "ERROR: Unknown MODE!" >&2 exit 2 fi echo $dat > $BACKUP_DIR/lastbackup sync fi if [ "$SILENT" != "true" ] then cat $BACKUP_DIR/backup.log cat $BACKUP_DIR/backup.err fi #EMAIL_LOG=true #EMAIL_ERR=true #EMAIL_ADDRESS="lbucher@opensourcefactory.com" #EMAIL_SUBJECT="$HOSTNAME Backup" if [ "$EMAIL_LOG" = "true" ] then cat $BACKUP_DIR/backup.log | mail -s "$EMAIL_SUBJECT backup.log" $EMAIL_ADDRESS fi mkdir -p $BACKUP_DIR/log errsize=`stat -c %s $BACKUP_DIR/backup.err` if [ "$errsize" != "0" ] then cp $BACKUP_DIR/backup.err $BACKUP_DIR/log/$dat.err if [ "$EMAIL_ERR" = "true" ] then cat $BACKUP_DIR/backup.err | mail -s "$EMAIL_SUBJECT backup.err" $EMAIL_ADDRESS fi fi cp $BACKUP_DIR/backup.log $BACKUP_DIR/log/$dat.log
-
Was sind die Highlights dieses Scripts?
-
Ich verwende kein Highlighting, aber ich kann mal kurz die zusätzlichen Features umreißen:
1. tar- oder rsync-Backup
2. Über Variablen im Scripthead Konfigurierbar -
Ich verwende kein Highlighting
Scherzkeks. -
Jetzt mitmachen!
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!