我运行一个自动备份shell脚本,它运行良好,但由于某种原因FTP阻止我几分钟。我想添加一个重试和等待功能。下面是我的代码示例。
echo "Moving to external server"
cd /root/backup/
/usr/bin/ftp -n -i $FTP_SERVER <<END_SCRIPT
user $FTP_USERNAME $FTP_PASSWORD
mput $FILE
bye
END_SCRIPT
登录失败后,我收到以下信息
Authentication failed. Blocked.
Login failed.
Incorrect sequence of commands: PASS required after USER
我需要捕获这样的输出并让代码在尝试再次尝试之前尝试睡眠几分钟。
想法?
答案 0 :(得分:1)
下面的消息可能是stderr而不是stdout,所以你需要先捕获stderr输出:
while true
do
if ( script 2>&1 |grep -q 'Authentication failed' )
then
echo "authentication failed, sleeping for a while before trying again"
sleep 60
else
#everything worked, break out of the while loop
break
fi
done
答案 1 :(得分:1)
如果您可以在感兴趣的系统上安装其他程序,我建议您查看lftp
。
使用lftp
,可以手动设置重新连接之间的时间等参数。
要使用lftp
实现目标,您必须调用以下内容
lftp -u user,password ${FTP_SERVER} <<END
set ftp:retry-530 "Authentication failed"
set net:reconnect-interval-base 60
set net:reconnect-interval-multiplier 10
set net:max-retries 10
<some more custom commands>
END
如果ftp:retry-530
之后的模式与服务器lftp
的530回复相匹配,则尝试每60 * 10秒重新连接一次。