【问题标题】:Wget Hanging, Script StopsWget 挂起,脚本停止
【发布时间】:2013-12-13 21:32:09
【问题描述】:

晚上,

我正在使用 xargs 运行很多 wget 命令

cat urls.txt | xargs -n 1 -P 10 wget -q -t 2 --timeout 10 --dns-timeout 10 --connect-timeout 10 --read-timeout 20

但是,一旦文件被解析,一些 wget 实例就会“挂起”。我仍然可以在系统监视器中看到它们,它们可能需要大约 2 分钟才能完成。

无论如何我可以指定实例应该在 10 秒后被杀死吗?我可以在以后重新下载所有失败的 URL。

在系统监视器中,wget 实例在挂起时显示为 sk_wait_data。 xargs 以“do_wait”的形式存在,但 wget 似乎是问题所在,因为一旦我杀死它们,我的脚本就会继续。

【问题讨论】:

    标签: http httprequest wget xargs


    【解决方案1】:

    我认为应该这样做:

    wget -v -t 2 --timeout 10
    

    根据文档:

    • --timeout:将网络超时设置为秒秒。这相当于指定 --dns-timeout、--connect-timeout 和 --read-timeout,同时进行。

    也检查详细的输出,看看它在做什么。

    另外,你可以试试:

    timeout 10  wget -v -t 2
    

    或者你可以做 timeout 在内部做的事情:

    ( cmdpid=$BASHPID; (sleep 10; kill $cmdpid) & exec wget -v -t 2 )
    

    (见于:BASH FAQ entry #68: "How do I run a command, and have it abort (timeout) after N seconds?"

    【讨论】:

    • 没有任何区别。我正在查看详细的输出,但内容太多了,如果这里有什么东西,我想我不会看到它。
    • 另外,-v 是多余的。 “默认输出是详细的。” (男人 wget)
    【解决方案2】:

    GNU Parallel 可以并行下载,并在超时后重试该过程:

    cat urls.txt | parallel -j10 --timeout 10 --retries 3 wget -q -t 2 
    

    如果获取 url 的时间发生变化(例如,由于更快的互联网连接),您可以让 GNU Parallel 找出超时时间:

    cat urls.txt | parallel -j10 --timeout 1000% --retries 3 wget -q -t 2 
    

    这将使 GNU Parallel 记录成功作业的中位时间,并将超时动态设置为该时间的 10 倍。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多