Wget 在 30 分钟后重试服务器错误,而不是 10 秒

Wget retrying server errors after 30 mins, not 10 seconds

我是 运行 Debian Stretch 服务器上的一个简单 bash 脚本,每晚通过 VPN 备份不同站点的多个工业设备。随着这些设备的老化,它们似乎会出现一个问题,即它们将通过 FTP 连接但拒绝提供目录列表。这会导致 wget 生成非致命错误。

我希望 wget 遵循 --waitretry 的选项来处理这个错误(来自手册页):

--waitretry=秒数
如果您不希望 Wget 在每次检索之间等待,而只是在重试失败下载之间等待,您可以使用此选项。 Wget 将使用线性退避,在给定文件第一次失败后等待 1 秒,然后在该文件第二次失败后等待 2 秒,直到您指定的最大秒数。默认情况下,Wget 将采用 10 秒的值。

但是,它没有等待默认的 10 秒,而是在两次重试之间等待 30 分钟。它还默认重试 20 次,将备份延迟数小时。我搜索了手册页、wget 在线文档、本地 /etc/wgetrc,找不到与 30 分钟或 1800 秒相关的选项。

这里有两次连续的尝试显示了 30 分钟的延迟和响应:

--2021-11-26 03:08:52--  ftp://user:*password*@192.168.18.4/SD1/
(try: 2) => ‘192.168.18.4/SD1/.listing’  
Connecting to 192.168.18.4:21... connected.  
Logging in as user ... Logged in!  
==> SYST ... done.    ==> PWD ... done.  
==> TYPE I ... done.  ==> CWD (1) /SD1 ... done.  
==> PORT ... done.    ==> LIST ...  
Error in server response, closing control connection.  
Retrying.

--2021-11-26 03:38:55--  ftp://user:*password*@192.168.18.4/SD1/
(try: 3) => ‘192.168.18.4/SD1/.listing’  
Connecting to 192.168.18.4:21... connected.  
Logging in as user ... Logged in!  
==> SYST ... done.    ==> PWD ... done.  
==> TYPE I ... done.  ==> CWD (1) /SD1 ... done.  
==> PORT ... done.    ==> LIST ...  
Error in server response, closing control connection.  
Retrying.

我在命令行中添加了 --tries=5 和 --waitretry=30 选项以尝试覆盖 30 分钟的延迟:

wget --waitretry=30 -t 5 -m --no-passive -o ftplog ftp://user:password@192.168.18.4/SD1/

尝试选项确实覆盖了默认的 20 次尝试,将其限制为 5 次尝试,但 waitretry 保持在 30 分钟。有人知道为什么会这样吗?

我找到了答案,虽然它没有解释为什么 wget 似乎忽略了一些选项。

今天早上我有另一台设备掉线了。如您所见,错误与我原来的 post(连接超时)不同,重试之间的延迟似乎是两分钟 + 12-13 秒。此设备的 wget 命令未指定 waitretry / 超时选项:

--2021-12-06 02:49:23--  ftp://user:*password*@192.168.40.3/SD1/
           => ‘192.168.40.3/SD1/.listing’
Connecting to 192.168.40.3:21... failed: Connection timed out.
Retrying.

--2021-12-06 02:51:35--  ftp://user:*password*@192.168.40.3/SD1/
  (try: 2) => ‘192.168.40.3/SD1/.listing’
Connecting to 192.168.40.3:21... failed: Connection timed out.
Retrying.

由于 --waitretry 没有效果,我将此选项更改为 --read-timeout 对于服务器响应无效的设备:

wget --read-timeout=60 -t 5 -m --no-passive -o ftplog ftp://user:password@192.168.18.4/SD1/

现在,重试回到 2 分钟(不是指定的 60 秒)加上 wget 文档中为 --waitretry 指定的线性退避。这没有回答我最初的问题,但它可以防止每次重试花费 30 分钟,这是一个可以接受的解决方法。