Search code examples
bashubuntu-14.04rsync

Store rsync error in variable


I've written a bash script to sync backups with a local storage, the script checks whether a backup as been made on the day the script is executed, and if so it sync's.

I've made it this way so that if by accident (or other way) all the backups are deleted from the original location, the synced backups on the second storage won't be deleted upon next sync.

#!/bin/bash
files_found=`ssh [email protected] "find /home/data_folder/test* -type f -mtime -1"`

rsync_to_location="/home/test_folder/";     
rsync_from_location="/home/data_folder/";


if [ "$files_found" = 0 ]; then
    echo "File not found!"
    send_error=`ssh [email protected] "echo 'This is the message body' | mail -s 'This is the subject' user@localhost"`
else
    echo "Files found!"
    rsync -arzt --ignore-existing --delete --max-delete=1 -e 'ssh' [email protected]:$rsync_from_location $rsync_to_location

    if [[ $? -gt 0 ]]; then
        send_error=`ssh [email protected] "echo 'This is the message body' | mail -s 'This is the subject' earmaster@localhost"`
    fi
fi

Now my question is, if the rsync fails (max deletions), how can I store that message and send it with the mail?

I've tried with

rsync_error="rsync -arzt --ignore-existing --delete --max-delete=1 -e 'ssh' [email protected]:$rsync_from_location $rsync_to_location"

And then add the $rsync_error to the mail call, but it doesn't seem to work


Solution

  • The line you have put here will just store that command as a string and not run it.

    rsync_error="rsync -arzt --ignore-existing --delete --max-delete=1 -e 'ssh' [email protected]:$rsync_from_location $rsync_to_location"
    

    To capture its output you would need to put it in a $( ) like so.

    rsync_error=$(rsync -arzt --ignore-existing --delete --max-delete=1 -e 'ssh' [email protected]:$rsync_from_location $rsync_to_location)
    

    This will capture the stdout of the executed command but you are wanting stderr I assume. So a better way of doing this might be to pipe to stderr to a file and handle the output that way.

    # rsync err output file
    ERR_OUTPUT="/tmp/rsync_err_$$"
    # When the script exits, remove the file
    trap "rm -f $ERR_OUTPUT" EXIT
    
    # Use 2> to direct stderr to the output file
    rsync -arzt --ignore-existing --delete --max-delete=1 -e 'ssh' [email protected]:$rsync_from_location $rsync_to_location 2> "$ERR_OUTPUT"
    
    # Do what ever with your error file