wget强制重试,直到有连接

时间:2015-06-22 15:08:33

标签: linux bash wget

我有一个使用{3}设备上运行的wget的bash脚本。我希望脚本暂停,直到我得到响应,所以我设置了我的代码:

wget -t 0 -T 15 --retry-connrefused www.example.com

问题在于,当根本没有连接时(3g下降几秒钟),DNS无法解析主机,wget会停止重试。

有没有办法强制重试,直到连接恢复?我知道我可以写一个循环,但我想知道wget中是否有我可以使用的设置。如果没有什么最好的变量来构建循环?

更多详情:

根据我写的代码,wget将重试但如果设备根本没有互联网连接(例如我从设备中拔出3g加密狗),它将停止重试,告诉我它可以'解析主机地址。它在-T 15

定义的15秒后发送
wget: unable to resolve host address

3 个答案:

答案 0 :(得分:9)

这个循环应该这样做:

while true;do
wget -T 15 -c http://example.com && break
done

<小时/> 工作原理:

  1. 如果没有网络连接,while loop将不会中断,它将连续运行wget命令并保持打印错误消息。
  2. 一旦连接到Internet,wget就会开始解析主机并获取文件。
  3. 现在,如果连接丢失或发生其他错误,默认重试(不要使用0inf,即无限次重试,使用限制值)wget将重试获取文件,直到达到超时15秒。 15秒后,wget命令将失败并打印错误输出,因此while loop不会中断。因此,它将再次进入没有连接的状态,并保持打印错误消息。
  4. 一旦连接或错误得到解决,wget就会开始解析主机并获取文件。只要文件未完全下载,这些步骤(1-4)就会继续。
  5. wget命令使用-c选项,即resume选项。因此wget的每个实例都将从它停止的位置开始(下载)。
  6. 当文件完全下载并且wget命令成功时,循环将中断。

答案 1 :(得分:1)

以下是可用于解决问题的脚本

FILENAME=$1
DOWNURL=$2

wget -O "`echo $FILENAME`" "`echo $DOWNURL`"
FILESIZE=$(stat -c%s "$FILENAME")

while [ $FILESIZE \< 1000 ]; do
    sleep 3
    wget -O "`echo $FILENAME`" "`echo $DOWNURL`"
    FILESIZE=$(stat -c%s "$FILENAME")
done

脚本强制下载继续,直到完成。可以更改1000以适合您正在下载的任何大小的文件。

答案 2 :(得分:0)

我不会使用循环。您最终可能会有多次下载。而是发明更智能的方法来检查网络连接。尝试事先ping一些网站,只有在成功时才发出wget。如果它们失败,脚本可以等待并再次尝试测试。 Ping可以进行安静测试,并使用计数和截止日期返回。