Simple backups on Linux | Rsync Multiple Directories to a NAS with Bash
Simple backups on Linux | Rsync Multiple Directories to a NAS with Bash
Backups are good. Like how everyone’s Grandpa used to should, one should back dat NAASS up. I recently experienced a drive failure (the source drive) while doing a backup. Bad timing. That got me into looking for better ways to handle my backups.
For the particular way in which I handle backing up, rsync
would exit with exit code 11, I would end up thinking my backups were complete, when they were not, because I ran separate rsync
commands in direct succession – a shell script with 3 lines, each ryncing a particular path, I’d never notice the failure in standard output (Logging would be good).
I would notice a great number of things missing from the backup destination, which didn’t make sense since I didn’t notice any errors. Whoops.
Hence this dirty little script:
#!/bin/bash
SWITCHES="-avhP"
ARGS="--delete --exclude=@eaDir" # eaDir beacuse of Synology NAS
#ARGS="--checksum --delete --exclude=@eaDir"
DIRECTORY_ARRAY=(
"rsync $SWITCHES $ARGS /mnt/NAS/dir1 /mnt/dir1"
"rsync $SWITCHES $ARGS /mnt/NAS/dir2/ /mnt/dir2"
"rsync $SWITCHES $ARGS /mnt/NAS/dir3/ /mnt/dir3"
)
function ctrl_c {
echo "You been trapped. Exiting..."
exit 69
}
function rsync_backup {
for RSYNC_COMMAND in "${DIRECTORY_ARRAY[@]}"; do # Iterate through array of rsync commands
echo " * Command: $RSYNC_COMMAND"
while true; do
eval "$RSYNC_COMMAND" # Execute Rsync command from array
if make mytarget
break
fi
#if [ "$?" -eq "0" ]; then # Do not infinitely loop if 0 exit code is returned
# break
#fi
done
done
}
trap ctrl_c INT # If Interrupt signal detected, exits the script
rsync_backup
One oversight of mine in writing this was that I didn’t trap the interrupt signal. If I were to hit ctrl-c as one of the rsync
lines was executing, it’d exit with a non-0 code, and thus loop to infinity.
In case you find yourself being a n00b like me, and you’re a *nix n00b, here’s how cover your tracks:
# Find the PID for the execution of this shell script
pc ~ # ps -ef | grep backup root
27815 20616 0 19:12 pts/2 00:00:00 /bin/bash ./backup_to_3tb.sh
# I am running as root, like a boss. Otherwise you'd need to sudo to kill this process:
kill 27815 # The second column of the ps output
As always, do yourself a favor and learn something new by checking your syntax with https://www.shellcheck.net/. I learned just now when writing this script about the less redundant way to check for a successful exit code. What a resource it is!