WGET 是不是超时?

Posted

技术标签:

【中文标题】WGET 是不是超时?【英文标题】:Does WGET timeout?WGET 是否超时? 【发布时间】:2011-01-18 11:46:20 【问题描述】:

我正在使用 Wget 通过 cron 运行 php 脚本,使用以下命令:

wget -O - -q -t 1 http://www.example.com/cron/run

脚本最多需要 5-6 分钟来处理。 WGet 会等待它并给它所需的所有时间,还是会超时?

【问题讨论】:

【参考方案1】:

默认超时为 900 秒。您可以指定不同的超时时间。

-T seconds
--timeout=seconds

默认为重试 20 次。您可以指定不同的尝试。

-t number
--tries=number

链接:wget man document

【讨论】:

【参考方案2】:

根据the man page of wget,有几个与超时相关的选项——默认读取超时为 900 秒——所以我说,是的,它可能会超时。

以下是有问题的选项:

-T seconds
--timeout=seconds

将网络超时设置为秒 秒。这相当于 指定--dns-timeout--connect-timeout,和 --read-timeout,都一样 时间。

对于这三个选项:

--dns-timeout=seconds

将 DNS 查找超时设置为秒 秒。 不支持的 DNS 查找 在规定时间内完成 将失败。 默认情况下,没有 DNS 查找超时,除了 由系统库实现。

--connect-timeout=seconds

将连接超时设置为秒 秒。 TCP 连接 再建立就会中止。 默认情况下,没有连接 超时,除了实施的 通过系统库。

--read-timeout=seconds

将读取(和写入)超时设置为 秒秒。 “时间” 此超时指的是空闲时间:如果, 在下载的任何时候,没有数据 收到超过 指定的秒数,读数 失败并重新开始下载。 此选项不直接 影响整个持续时间 下载。

我想使用类似

wget -O - -q -t 1 --timeout=600 http://www.example.com/cron/run

应确保在超过脚本持续时间之前没有超时。

(是的,这可能是最残酷的解决方案^^)

【讨论】:

如果我设置 -t 0 会无限期等待吗? -t 选项似乎是--tries 的别名,它将重试次数设置为number。 ;;;它似乎与任何类型的超时无关,而是与 wget 在出现错误时重新尝试下载的次数有关——而且您可能不希望将超时视为错误,并且脚本被重新调用。 --timeout=0 将禁用超时 我可能是这个星球上的那个,但对于 ubuntu 16 wget 只是忽略了 --timeout 的值。可能是因为我在命令中使用了基本身份验证【参考方案3】:

因为在你的问题中你说它是一个 PHP 脚本,也许最好的解决方案是简单地添加你的脚本:

ignore_user_abort(TRUE);

这样,即使wget 终止,PHP 脚本也会继续处理,至少直到它不超过max_execution_time 限制(ini 指令:默认为 30 秒)。

根据wgetanyay,你不应该改变它的超时,according to the UNIX manual默认的 wget 超时是 900 秒(15 分钟),这比你需要的 5-6 分钟大得多.

【讨论】:

【参考方案4】:

在 1.14 版之前,如果由于 bug 而通过 https 下载,则不遵守 wget 超时参数。

【讨论】:

该死! CentOS 6 附带 wget 1.12,我在 https 链接上遇到了同样的问题 我遇到了完全相同的错误! Wget 在证书过期的 https 链接处停止! 我有一个带有 wget 版本 1.20.3 的 Linux,它也忽略“-T x”并且永远不会在错误的 IP 上终止,这就是我使用“超时”命令的原因:“ timeout 5 wget ..." 在我的情况下完美运行。【参考方案5】:

wget 超时值与下载文件所需的时间无关。

如果您触发的 PHP 脚本在那里闲置 5 分钟并且没有返回数据,如果 wget 的 --read-timeout 设置为小于执行脚本所需的时间,则会触发。

如果您实际上是在下载文件,或者如果 PHP 脚本发回一些数据,例如 ... 进度指示器,那么只要脚本正在执行某项操作,就不会触发读取超时。

wget --help告诉你:

  -T,  --timeout=SECONDS           set all timeout values to SECONDS
       --dns-timeout=SECS          set the DNS lookup timeout to SECS
       --connect-timeout=SECS      set the connect timeout to SECS
       --read-timeout=SECS         set the read timeout to SECS

因此,如果您使用--timeout=10,它会将 DNS 查找、连接和读取字节的超时设置为 10 秒。

下载文件时,您可以将超时值设置得非常低,只要您与要连接的站点有良好的连接,您仍然可以在 5 分钟内下载一个大文件,超时时间为 10 秒。如果您与站点或 DNS 的临时连接失败,则传输将在 10 秒后超时,然后重试(如果 --tries aka -t 大于 1)。

例如,这里我从 NVIDIA 下载一个需要 4 分钟下载的文件,并且我将 wget 的超时值设置为 10s:

$ time wget --timeout=10 --tries=1 https://developer.download.nvidia.com/compute/cuda/11.2.2/local_installers/cuda_11.2.2_460.32.03_linux.run
--2021-07-02 16:39:21--  https://developer.download.nvidia.com/compute/cuda/11.2.2/local_installers/cuda_11.2.2_460.32.03_linux.run
Resolving developer.download.nvidia.com (developer.download.nvidia.com)... 152.195.19.142
Connecting to developer.download.nvidia.com (developer.download.nvidia.com)|152.195.19.142|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3057439068 (2.8G) [application/octet-stream]
Saving to: ‘cuda_11.2.2_460.32.03_linux.run.1’

cuda_11.2.2_460.32.03_linux.run.1        100%[==================================================================================>]   2.85G  12.5MB/s    in 4m 0s

2021-07-02 16:43:21 (12.1 MB/s) - ‘cuda_11.2.2_460.32.03_linux.run.1’ saved [3057439068/3057439068]


real    4m0.202s
user    0m5.180s
sys 0m16.253s

4m下载,超时10s,一切正常。

一般来说,使用低值超时 DNS、连接和读取是个好主意。如果您将其保留为默认值 900s,那么每次 DNS 或 Internet 连接出现问题时,您将等待 15m。

【讨论】:

以上是关于WGET 是不是超时?的主要内容,如果未能解决你的问题,请参考以下文章

wget下载命令

wget 参数--spdier的妙用

paping使用来测试联通&网站由于tcp协议导致的无法通信问题超时问题

Nginx 反向代理导致 504 网关超时

Ajax:设置超时是不是总是覆盖浏览器的超时?

会话超时是不是在每个请求上重置