Help with Backup Shell Script

Hi,

I am a linux newbie and I dont have any knowledge on scripting but this is my urgent requirement. I am suppose to write a backup script for 2 of my servers, could someone help me out please. below is my requirement

Mail Server 1 : 10.0.0.1 Mail Server 2 : 10.0.0.2 Backup Server : 192.0.0.1

  1. Mail Server 1 & 2 must take daily backups of /var and /etc and store them locally.
  2. These backups must be moved to Backup Server on daily basis, once the above local backup is done.
  3. Mail Server 1 & 2 must store backups for 7 days and later remove them.
  4. Backup Server must store backup for 3 months and later remove them.
  5. Files must be stored in tar.gz format.
  6. I need the script in such a way that I can add directorys in future.
  7. Once the backup is performed, need to send a confirmation mail that its been completed successfully to admin@xyz.com

Also I would like to know what are the important directories we should consider backing up in a mail server. Can you please give me inputs on backup procedures.

Thanks a lot !!!

What have you tried so far? The purpose of this forum isn't for people to request ready-to-go scripts, but to provide help when you're stuck.

hi pludi,

as I mention earlier, I dont have any knowledge on scripting and I understand that its a mandatory that a linux admin must be aware of any 1 scripting lang. I have started learning the basics of shell scripting just couple of days back.

For taking internal backups, I came up with 2 scripts

1)

 /bin/scripts/back.sh
   
  #! /bin/bash
  echo Backup Started `date` >> ~/backuplog
  mkdir /tempstorage/`date +%Y%m%d`
  tar -czf /tempstorage/`date +%Y%m%d`/cloud.tar.gz /cloud
  echo Backup Completed `date` >> ~/backuplog

I was advised to use variables from my Senior

2)

#!/bin/sh

# What to backup.
backup_files="/tmp"

# Where to backup to.
dest="/backup"

# Create archive filename.
day=$(date +%A)
hostname=$(hostname -s)
archive_file="$hostname-$day.tgz"

# Print start status message.
echo "Backing up $backup_files to $dest/$archive_file"
date
echo

# Backup the files using tar.
tar czf $dest/$archive_file $backup_files

# Print end status message.
echo
echo "Backup finished"
date

# Long listing of files in $dest to check file sizes.
ls -lh $dest

Since its an urgent task and I am suppose to complete my task in next 2 days, I dont have much time to learn it and write, Can you please help me out this time, so that I will start learning them perfectly from scratch. I am just starting with the book "Learning the bash Shell: Unix Shell Programming... by Cameron Newham" please do advice if there are any other good book for beginners (who dont have programming knowledge earlier).

thanks

2 reads that I can recommend, though a bit dated: Bash Programming Introduction and Advanced Bash Scripting.

My suggestion is get the flow of the script down first, without thinking too much about the programming language. Eg.

for each directory to be backed up
  create an archive of that directory
  if successful
    copy the archive to the backup server
    remove all but the last 7 backups
    send a mail to the admin
  else
    send the error to the admin

On the backup server

find all backups older than 3 months and remove them

Then, create small parts of the script task by task, eg. create the loop you need, then how to remove all but the last 7 backups, how to copy it to the backup server, ... You won't need much syntax for a script like this, and you should do with these commands: man find (Linux), man scp (Linux), man tar (Linux), man mailx (Linux).

And 2 days left isn't all that much time, so either you've been slacking off, pretended that you know shell scripting during the interview, or your boss doesn't know what kind of effort really is needed.

1 Like

thanks for the flow. I will try it now

(p.s. I never pretended stating I knew scripting and even my boss new that I am not aware of it but he wants me to learn and do things and so he gave me 3 days of time, if not he must have forced me to do it imdtly werein I would have been fired by now :eek:)

also thanks for the links

Forgot one: man crontab (Linux) for daily scheduling

I'm very new to Linux, but here are two I made that might give you some ideas. The first is the Backup script I use for MYSQL, and the script below it cleans up old backups. It is the first script I wrote myself. I should really update them since I have leaned so much since then on what is wrong with these, but they have worked flawlessly for me.

I hope they might help.

#!/bin/bash 
#Backup Script for a Server
#
# First Create 2 folders "/usr/local/bin/backup/" and 
# "/usr/local/bin/tar"
#
NOWDATE=NAME OF ARCHIVE-`date +%d%m%y`.tgz 
BACKUPDIR=/usr/local/bin/backup/ 
BACKUPTAR=/usr/local/bin/tar 
MOUNTLOC=//X.X.X.X/path/to/mount/
USERNAME=username=xxx 
PASSWORD=password=xxx

# This tells MYSQL to dump all of it's databases to the $BACKUPDIR 
# directory.
mysqldump -u xxxxx -pxxxxxx --all-databases > $BACKUPDIR/xxxx.sql

#This copies all files/directories to the BACKUPDIR.
cp -r /whatever/you/want /usr/local/bin/backup

#This uses tar with compression to put it all in one file.
tar pcfz $BACKUPTAR/$NOWDATE $BACKUPDIR

#This mounts the SAN drive.
mount -t smbfs $MOUNTLOC /mnt -o $USERNAME,$PASSWORD

#This copies the contents of the BACKUP tar files to the SAN.
cp $BACKUPTAR/* /mnt

#This emails a log of what was backed up.
ls -trlh /mnt | tail -1 | mail -s "Server Backup Results" someguy@domain.com

#This unmounts the mounted SAN drive.
umount /mnt

#This removes all files from the BACKUPDIR.
rm -rf $BACKUPDIR/*

#This removes all files from the BACKUPTAR
rm $BACKUPTAR/*

exit 0

-------------------------------------------
To clean up the destination directory I use this:

#!/bin/bash
#  Script to tidy up Backups older than 2 days after they went to tape.

MOUNTDIR=//X.X.X.X/Path/to/Backup/Dir
EMAIL=someguy@domain.com
USERNAME=username=xxx
PASSWORD=password=xxx

#This mounts the S drive folder.
mount -t smbfs $MOUNTDIR /mnt -o $USERNAME,$PASSWORD

#Find files older than 2 days.
find /mnt -mtime +1 | mail -s "Backups Deleted" $EMAIL

# This command finds and deletes files older than 2 days and emails me.
find /mnt -mtime +1 -exec rm -f {} \;

#This unmounts the mounted S drive.
umount /mnt