在变量中存储rsync错误

时间:2015-06-04 06:26:46

标签: bash ubuntu-14.04 rsync

我已经编写了一个bash脚本来将备份与本地存储同步,该脚本会检查脚本执行当天是否进行了备份,如果是,则会同步备份。

我已经这样做了,所以如果偶然(或其他方式)所有备份都从原始位置删除,第二个存储上的同步备份将不会在下次同步时被删除。

#!/bin/bash
files_found=`ssh user@xx.xx.xx.xx "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 user@xx.xx.xx.xx "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' user@xx.xx.xx.xx:$rsync_from_location $rsync_to_location

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

现在我的问题是,如果rsync失败(最大删除),我该如何存储该邮件并将其与邮件一起发送?

我已经尝试了

rsync_error="rsync -arzt --ignore-existing --delete --max-delete=1 -e 'ssh' user@xx.xx.xx.xx:$rsync_from_location $rsync_to_location"

然后将$rsync_error添加到邮件调用中,但它似乎无法正常工作

1 个答案:

答案 0 :(得分:2)

您放在此处的行只会将该命令存储为字符串而不会运行它。

rsync_error="rsync -arzt --ignore-existing --delete --max-delete=1 -e 'ssh' user@xx.xx.xx.xx:$rsync_from_location $rsync_to_location"

要捕获其输出,您需要将其放在$( )中。

rsync_error=$(rsync -arzt --ignore-existing --delete --max-delete=1 -e 'ssh' user@xx.xx.xx.xx:$rsync_from_location $rsync_to_location)

这将捕获已执行命令的标准输出,但您想要stderr我假设。因此,更好的方法是将stderr传递给文件并以这种方式处理输出。

# 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' user@xx.xx.xx.xx:$rsync_from_location $rsync_to_location 2> "$ERR_OUTPUT"

# Do what ever with your error file