Small College homework

Use and complete the template provided. The entire template must be completed. If you don't, your post may be deleted!

  1. The problem statement, all variables and given/known data:

My work is to write or design a script in bash shell script format for the Linux O/S Debian distro "Knoppix 6.7".

What the script needs to do is basically delete temporary files and back up data from one directory/folder to another designated Backup.

  1. Relevant commands, code, scripts, algorithms:

  2. The attempts at a solution (include all code and scripts):

#!/bin/bash
#This script will automatically delete temporary files
rm -rf /tmp/*
rm -rf/var/tmp/*
fsck -A
exit
#! /bin/bash
# Variables
location=/home/veiset
directory=Documents
backuplocation=/media/veiset/backup
log=~/backup.log
echo -e �\nBackup started: `date`� >> $log
if [ -d $backuplocation ]; then
mkdir -p $backuplocation/`date +%y%m%d`
cd $location
tar -cvvf $backuplocation/`date +%y%m%d`/data.`date +%H%M%S`.tar.gz $directory
echo � completed: `date`� >> $log
cp $log $backuplocation/backup.log
echo -e �\n � Backup completed �\n�;
else
echo � FAILED: `date`� >> $log
echo -e �\n� WARNING: ��
echo -e �� BACKUP FAILED �\n�;
fi
exit

I'm not too sure on what else to do, and if I am doing it right!?

  1. Complete Name of School (University), City (State), Country, Name of Professor, and Course Number (Link to Course):
    wanstead sixth form
    london
    england

You're on the right path as far as I can tell. A couple of suggestions/comments

1) I'm not sure why you're running fsck in your first script. Typically fsck is run on a filesystem that is not mounted. Maybe your instructions indicate you should, but it's not something that I've commonly (if ever) done especially in a tmp cleaner.

2) Your options to tar might be mistyped. Did you mean to have tar do the gzipping? I gather you did from the name of the output file, but the options aren't correct if that is the case.

3) Verbose messages from tar will not be captured in your log file. Have a look at the tar man page, or run a small test at the command line to see how you can capture the verbose output (I assume you want to).

4) Indention will make the script much easier to read.

Hope this helps.

---------- Post updated at 18:41 ---------- Previous update was at 18:39 ----------

One more thing I noticed.... You don't handle the log file the same when you have an error condition. If you want to copy it to the same spot regardless of the state (success or failure), then just have one copy command just before the exit which will take care of all cases.

You shouldn't be calling fsck on a booted system, yes, especially not fsck -A. If you're lucky it will refuse to do anything, if you're not, you could mess up your system.

You shouldn't be using * on something that could have lots of files.

#!/bin/bash
# This will work sometimes, but is likely to die with 'too many arguments'
# when /tmp/ has a lot of files in it.  * has limits.
# rm -rf /tmp/*

# This should find all files and folder in the base directory of '/tmp'
# and print "rm -Rf file1 file2 ...".  Remove the 'echo' once you're sure
# it does what you want.
find /tmp -mindepth 1 -maxdepth 1 | 
while read LINE
do
        # Remove the 'echo' once you're sure it does what you want
        echo rm -Rf "$LINE"
done

You don't need to reopen $log 9,000 times to print 9,000 times. Open it once, and print to it.

exec 1>$log
echo "This line will now go directly into logfile"
echo "This line will still be printed to the terminal" >&2

Use printf, not "echo -e", as echo -e is not portable. Note that printf needs you to specify \n on the end when you want them.

echo -e "\nThis is not portable"
printf "\nThis is\n"

Run date once and save it in a variable, or else the date might just change halfway through the script on an unlucky midnight.

# Variables
location=/home/veiset
directory=Documents
backuplocation=/media/veiset/backup
backupdate=`date +%y%m%d`
backuptoday="${backuplocation}/${backupdate}"

Check the return values of things. Your script at present won't have any idea whether it succeeded or failed. Your script returns success even when it knows it failed, too.

And instead of nesting your if-statements, you should quit immediately. That way you can just list conditions to quit on instead of nesting 9 deep when checking 9 things.

If you want tar to make a tar.gz, you have to give it -z as well.

The "cd" is pointless since you're giving tar absolute paths anyway, you can remove it.

function die
{
        # Print to logfile
        echo "$@"
        # Print again to terminal
        echo "$@" >&2
        # return error code, not success
        exit 1
}

[ -d "$backuplocation" ] || die "Backup location $backuplocation doesn't exist"
mkdir -p "$backuptoday" || die "Couldn't create today's folder $backuptoday"

tar -zcvvf $backuplocation/`date +%y%m%d`/data.`date +%H%M%S`.tar.gz $directory ||
        die "tar failed"

Note that pasting these together won't give you a complete script, I'm commenting on bits and pieces and advising what to change.