【问题标题】:wget hangs with -r and -O -wget 挂起 -r 和 -O -
【发布时间】:2013-10-30 11:44:27
【问题描述】:

这是一个非常奇怪的wget 行为。我在 debian 7.2 上。

wget -r -O - www.blankwebsite.com

永远挂起。我的意思是它挂起,它没有通过互联网搜索, 我可以用strace 验证它。 如果我这样做:

while read R
do
   wget -r -O - www.blankwebsite.com
done < smallfile

smallfile 包含一行,命令会在几秒钟后退出。

我也试过了

wget -r -O - localhost/test.html

使用空的test.html 文件,结果相同。对我来说,这听起来像是一个错误。
使用-O myfile 更改-O - 或删除-r,一切运行良好。
我使用了-O -,因为我将输出传递给grep
谁能解释一下?你见过类似的吗?

【问题讨论】:

    标签: recursion stdout wget freeze


    【解决方案1】:

    当然:

     wget -r -O file www.blankwebsite.com
    

    有效,但BUG是:

     wget -r -O - www.blankwebsite.com
    

    挂起!

    同样的问题是如果你创建一个 FIFO

    mkfifo /tmp/myfifo
    wget -r -O /tmp/myfifo www.blankwebsite.com
    

    当使用 -r 选项调用 wget 时,将尝试查找读取输出文件的 HTML“a href=...”标签。由于输出文件是 FIFO 或 stdout(例如 HYPHEN char '-'),它无法找到任何标签并等待 INPUT。然后,您将有一个 wget 进程在 read 系统调用上永远等待。

    要解决此问题,您可以: 1) 修补 wget 来处理这种情况 2)补丁wget不允许“-r -O -”组合......(只需检查'-O'的参数是否为常规文件) 3) 使用以下解决方法:

    TMPFILE=$(mktemp /tmp/wget.XXXXXX)
    wget -r -O $TMPFILE www.blankwebsite.com
    grep STRING $TMPFILE
    rm $TMPFILE
    

    【讨论】:

    • 我知道 -O file 的形式有效,我知道错误是使用 ` -O -` 时,这正是我写的。你读完了所有的东西吗?我的问题不同。为什么在while 中包含代码有效?我的问题是:“你能解释一下吗?”和“你见过类似的东西吗?”
    • 在 while 循环中,您有一个“读取”和一个重定向“
    • 你不是把标准输出和标准输入混淆了吗? &lt; smallfile 关闭标准输入,而不是标准输出。与您之前所说的相同,-r 将尝试查找正在读取的 HTML 标记...输出?为什么它应该读取输出?同样使用 FIFO,wget 从指定的站点读取行,而不是从输出中读取!相当混乱的答案......
    • Sorry wget output stdin/stdout,我刚刚弄错了。我试图更好地解释它。当使用“-r -O-”调用 wget 时,它会从网站读取并将输出发送到标准输出。但是,这仅适用于第一个 html 页面。 “-r”将在输出中搜索href标签......使用“-O -”您已将wget输出重定向到stdout,因此“-r”尝试读取stdout以查找href标签并进行递归。这是一个错误。正如我在第一个答案中所说的那样,fifo 也是如此。您的 while 循环可以转换为 wget -r -O - www.blankwebiste.com &lt;/dev/null
    【解决方案2】:

    @tonjo : 请你试试下面的代码。

    wget -r -O file www.blankwebsite.com
    

    而不是使用

     wget -r -O - www.blankwebsite.com
    

    【讨论】:

    • 如果你仔细阅读了整个问题,我就这样做了,我指出问题只在于标准输出版本
    【解决方案3】:

    如文档中所述:

     Similarly, using '-r' or '-p' with '-O' may not work as you expect:
     Wget won't just download the first file to FILE and then download
     the rest to their normal names: _all_ downloaded content will be
     placed in FILE.  This was disabled in version 1.11, but has been
     reinstated (with a warning) in 1.11.2, as there are some cases
     where this behavior can actually have some use.
    

    这是一个已知问题,也是以某种方式下载的,使用 -r 和 -O 处理不可搜索的文件不适用于 wget 将数据直接序列化到文件的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多