Bash 自动 rsync 备份脚本不显示正确的退出消息

Bash script for automatic rsync backups does not display correct exit message

我正在编写我的 bash 脚本,该脚本将从我的所有服务器备份文件,然后 cron 会通过电子邮件将输出通过电子邮件发送给我,但即使 rsync 失败,我也会收到一条消息,它有成功了。请帮助我找到以下代码中的问题:

#!/bin/bash
echo "##############################"
echo "Initializing a backup"
echo "##############################"
sleep 5

echo ""
echo ""
echo "#########################"
echo "Backup of TS3Intel begins"
echo "#########################"
echo ""
echo ""
sleep 5
rsync -avP --delete root@xxxxxx:/home/ts3/TS3 /media/SYNC/TS3Intel
retval=$?
if [ $? -eq 0 ]; then
    echo ""
    echo ""
    echo "VVVVVVVVVVVVVVVVVVVVVVVVVVVV"
    echo "Backup of TS3Intel completed"
    echo "VVVVVVVVVVVVVVVVVVVVVVVVVVVV"
    echo ""
    echo ""
    sleep 2
else
    echo ""
    echo ""
    echo "XXXXXXXXXXXXXXXXXXXXXXXXX"
    echo "Backup of TS3Intel failed"
    echo "XXXXXXXXXXXXXXXXXXXXXXXXX"
    echo ""
    echo ""
    sleep 2
fi


echo ""
echo ""
echo "#########################"
echo "Backup of TSCrispy begins"
echo "#########################"
echo ""
echo ""
sleep 5
rsync -avP --delete root@xxxxxxxx:/home/TS3 /media/SYNC/TS3Crispy
retval=$?
if [ $? -eq 0 ]; then
    echo ""
    echo ""
    echo "VVVVVVVVVVVVVVVVVVVVVVVVVVVV"
    echo "Backup of TSCrispy completed"
    echo "VVVVVVVVVVVVVVVVVVVVVVVVVVVV"
    echo ""
    echo ""
    sleep 2
else
    echo ""
    echo ""
    echo "XXXXXXXXXXXXXXXXXXXXXXXXX"
    echo "Backup of TSCrispy failed"
    echo "XXXXXXXXXXXXXXXXXXXXXXXXX"
    echo ""
    echo ""
    sleep 2
fi

echo ""
echo ""
echo "##########################"
echo "Backup of CrispyWEB begins"
echo "##########################"
echo ""
echo ""
sleep 5
rsync -avP --delete -e "ssh -p 22" root@xxxxxxxx:/var/www /media/SYNC/
retval=$?
if [ $? -eq 0 ]; then
    echo ""
    echo ""
    echo "VVVVVVVVVVVVVVVVVVVVVVVVVVVVV"
    echo "Backup of CrispyWEB completed"
    echo "VVVVVVVVVVVVVVVVVVVVVVVVVVVVV"
    echo ""
    echo ""
    sleep 2
else
    echo ""
    echo ""
    echo "XXXXXXXXXXXXXXXXXXXXXXXXXX"
    echo "Backup of CrispyWEB failed"
    echo "XXXXXXXXXXXXXXXXXXXXXXXXXX"
    echo ""
    echo ""
    sleep 2
fi

echo ""
echo ""
echo "############################"
echo "Backup of MYSQLCrispy begins" 
echo "############################"
echo ""
echo ""
sleep 5
rsync -avP --delete -e "ssh -p 22" root@xxxxxxxx:/root/mysqldump /media/SYNC/mysql
retval=$?
if [ $? -eq 0 ]; then
    echo ""
    echo ""
    echo "VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV"
    echo "Backup of MYSQLCrispy completed" 
    echo "VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV"
    echo ""
    echo ""
    sleep 2
else
    echo ""
    echo ""
    echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    echo "Backup of MYSQLCrispy failed"
    echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXX" 
    echo ""
    echo ""
    sleep 2
fi

echo ""
echo ""
echo "########################"
echo "Backup of TSBumba begins"
echo "########################"
echo ""
echo ""
sleep 5
rsync -avP --delete -e "ssh -p 696" root@xxxxxxxx:/home/teamspeak3-server_linux-amd64 /media/SYNC/TSBumba
retval=$?
if [ $? -eq 0 ]; then
    echo ""
    echo ""
    echo "VVVVVVVVVVVVVVVVVVVVVVVVVVV"
    echo "Backup of TSBumba completed"
    echo "VVVVVVVVVVVVVVVVVVVVVVVVVVV"
    echo ""
    echo ""
    sleep 2
else
    echo ""
    echo ""
    echo "XXXXXXXXXXXXXXXXXXXXXXXX" 
    echo "Backup of TSBumba failed"
    echo "XXXXXXXXXXXXXXXXXXXXXXXX"
    echo ""
    echo ""
    sleep 2
fi 

echo ""
echo ""
echo "########################"
echo "Compressing files begins" 
echo "########################".
echo ""
echo ""
sleep 5
tar czf /media/SYNCtar/copy_$today.tar.gz  /media/SYNC/
retval=$?
if [ $? -eq 0 ]; then
    echo ""
    echo ""
    echo "VVVVVVVVVVVVVVVVVVVVVVVVVVV"
    echo "Compressing files completed"
    echo "VVVVVVVVVVVVVVVVVVVVVVVVVVV"
    echo ""
    echo ""
    sleep 2
else
    echo ""
    echo ""
    echo "XXXXXXXXXXXXXXXXXXXXXXXXXXX"
    echo "Compressing of files failed"
    echo "XXXXXXXXXXXXXXXXXXXXXXXXXXX"
    echo ""
    echo ""
    sleep 2
fi

echo ""
echo ""
echo "#############################"
echo "Downloading site files begins" 
echo "#############################"
echo ""
echo ""
sleep 5
rsync -avP --delete -e "ssh -p 696" root@xxxxxxxx:/var/www /var/www/kopie/
retval=$?
if [ $? -eq 0 ]; then
    echo ""
    echo ""
    echo "VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV"
    echo "Download of site files completed"
    echo "VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV"
    echo ""
    echo ""
    sleep 2
else
    echo ""
    echo ""
    echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    echo "Downloading of site files failed"
    echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    echo ""
    echo ""
    sleep 2
fi

这是这部分代码的示例输出:

05:19:21 Klocex@root [~/sync]: ./1.sh


#########################
Backup of TSCrispy begins
#########################


receiving incremental file list
^Crsync error: unexplained error (code 130) at rsync.c(632) [generator=3.1.1]rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at io.c(504) [receiver=3.1.1]

rsync: [generator] write error: Broken pipe (32)


VVVVVVVVVVVVVVVVVVVVVVVVVVVV
Backup of TSCrispy completed
VVVVVVVVVVVVVVVVVVVVVVVVVVVV

即使rsync被我停止了,它给我的信息是它已经成功了。

PS: rsync 脚本中的 IP 已更改为 xxx,目的是在论坛上发帖。

if [ $? -eq 0 ]

可以替换为:

if [ "$retval" -eq 0 ]

其实直接使用rsync的return值可以大大简化程序,像这样:

if rsync -avP --delete -e "ssh -p 22" root@xxxxxxxx:/root/mysqldump /media/SYNC/mysql
then ....