Rsync Backup Script

From XMission Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Introduction

This is a sample backup script, utilizing rsync, which will backup a Linux or Mac OS X system to XMission's Remote Drive service. It can be adapted easily for other servers.

After the initial copy, it only backs up incremental changes, saving you time and storage.

Script

#!/bin/bash
HOST=`hostname -s`
EXCLUDE='--exclude=**/[Cc]ache/**'
RSYNC_ARGS="-vaz --progress --delete --delete-excluded --delete-after $EXCLUDE"
BACKUP_DIRS="/var/www /home /etc /usr/local /var/spool/cron /var/lib"
SERVER="shell.xmission.com"
SERVERDIR="backup"
DATE=`date +%Y%m%d-%H%M%S`

ssh $SERVER "if [ ! -f $SERVERDIR/log ]; then mkdir $SERVERDIR/log; \
  fi;
  if [ ! -f $SERVERDIR/$HOST/daily.0 ]; then mkdir $SERVERDIR/$HOST/daily.0; \
  fi"

ssh $SERVER "rm -rf $SERVERDIR/$HOST/daily.8; \
  mv $SERVERDIR/$HOST/daily.7 $SERVERDIR/$HOST/daily.8; \
  mv $SERVERDIR/$HOST/daily.6 $SERVERDIR/$HOST/daily.7; \
  mv $SERVERDIR/$HOST/daily.5 $SERVERDIR/$HOST/daily.6; \
  mv $SERVERDIR/$HOST/daily.4 $SERVERDIR/$HOST/daily.5; \
  mv $SERVERDIR/$HOST/daily.3 $SERVERDIR/$HOST/daily.4; \
  mv $SERVERDIR/$HOST/daily.2 $SERVERDIR/$HOST/daily.3; \
  mv $SERVERDIR/$HOST/daily.1 $SERVERDIR/$HOST/daily.2; \
  cp -al $SERVERDIR/$HOST/daily.0 $SERVERDIR/$HOST/daily.1"

for DIR in $BACKUP_DIRS; do
   rsync $RSYNC_ARGS $DIR ${SERVER}:$SERVERDIR/$HOST/daily.0/ >>/tmp/$HOST-$DATE
done

gzip --best /tmp/$HOST-$DATE

scp /tmp/$HOST-$DATE.gz $SERVER:$SERVERDIR/log

rm /tmp/$HOST-$DATE.gz

Cron Entry

You will need a cron entry to rotate out the old weekly directories and prune the log files, depending on how long you want to keep them. The below example keeps a month's worth of weekly incremental backups.

15 3 * * Sun backup-weekly >/dev/null 2>&1
0 5 * * * find backup/log -type f -mtime +14 -exec rm -rf {} \;

backup-weekly script:

#!/bin/sh

cd backup
for DIR in `ls -1d */daily.8 | awk -F / '{print $1}'`; do
  cd $DIR
  rm -rf weekly.[3456789]
  mv weekly.2 weekly.3
  mv weekly.1 weekly.2
  mv daily.8 weekly.0
  cd ..
done