wget 强制重试直到有连接

wget force retry until there is a connection

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

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

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

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

更多详情:

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

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

我不会使用循环。您最终可能会进行多次下载。而是发明更智能的方法来检查网络连接。尝试预先 ping 一些站点,只有在成功时才发出 wget。如果他们失败了,脚本可以等待并再次尝试测试。 Ping 可以进行静默测试并使用 returns.

的计数和截止日期

这是一个可以用来解决问题的脚本

FILENAME=
DOWNURL=

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 可以更改以适合您正在下载的任何大小的文件。

这个循环应该这样做:

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


工作原理:

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