#/bin/bash
#rsync自动重试warp;直到成功
SCRIPTPATH=$(realpath $0)
display_usage() {
    echo -e "$SCRIPTPATH\n"
    echo -e "\trsync自动重试脚本,rsync执行失败后重新运行命令,可指定最大重试次数和重试间隔时间;"
    echo -e "\t参数一即失败重试次数,可省略,缺省次数为-1,默认反复执行直到返回成功."
    echo -e "\t参数二即周期延时时间,可省略,缺省参数为20,即间隔20s进行下一次循环调用."
    echo -e "\nUsage:\n\trsync-retry [max-try-times] [delay-seconds-time] rsync~options~~"
    echo -e "Example:\n\trsync-retry 10 20 -rlvvzPD --size-only --bwlimit ./ winhk:/root/files/"
}
# if less than two arguments supplied, display usage
if [  $# -lt 1 -o "$*" == "-h" ]
then
    display_usage
    exit 1
fi

# check whether user had supplied -h or --help . If yes display usage
#if [[ ( $# == "--help") ||  $# == "-h" ]]
if [[ ( $* == "--help") ||  $* == "-h" ]]
then
    display_usage
    echo -e "\n-------------------------------------------------\n"
    #exit 0
fi

#Option:默认重试次数
retry_time=-1

#判断第一个参数是否为纯数字,如果是数字,则认定为命令最大重试次数
expr $1 "+" 10 &> /dev/null  
if [ $? -eq 0 ];then
retry_time=$1
shift
fi

##空格路径文件处理
#IFS=$(echo -en "\n\b")

#Option:默认延时
delay_time=20

#判断第二个参数是否为纯数字,如果是数字,则认定为重复调用命令的间隔时间
expr $1 "+" 10 &> /dev/null  
if [ $? -eq 0 ];then
delay_time=$1
shift
fi

return_val=-1
run_time=0
while [ "$return_val" -ne 0 -a "$retry_time" -eq "-1" ] || [ "$return_val" -ne 0 -a "$run_time" -lt "$retry_time" ]
do
#只有指定有限次的(具体数值)运行次数时,程序才计算命令当前累计调用的次数
if [ "$retry_time" -ne "-1" ];
then 
let run_time+=1
fi
rsync $*
return_val=$?
if [ "$retry_time" -ne "-1" ];
then
echo -e "\t第 ${run_time} 次返回值:${return_val}  (${run_time}/${retry_time})\n"
fi
## 如果是最后一次调用或者此次调用命令返回成功值,则不进行延时
if [ ${run_time} -ne ${retry_time} ] && [ ${return_val} -ne 0 ];then
#重试延时,默认为20s,不需要可以注释掉,最好适当增加延时,哪怕一秒也OK,0延时可能导致Ctrl + C无法中断指令。
sleep ${delay_time}
fi
done

echo -e "\t命令序列执行完毕..."

扫描二维码,在手机上阅读!