【问题标题】:How does data get processed across pipes?如何跨管道处理数据?
【发布时间】:2011-06-14 10:50:35
【问题描述】:

我使用了我在another post on SO 中找到的这个命令行程序,它描述了如何爬取网站。

wget --spider --force-html -r -l2 http://example.com 2>&1 | grep '^--' | awk '{ print $3 }' | grep -v '\.\(css\|js\|png\|gif\|jpg\)$' > wget.out

当我抓取一个大型网站时,需要很长时间才能完成。同时磁盘上的 wget.out 文件大小为零。那么管道数据什么时候被处理并写入磁盘上的文件呢?是在管道中的每个阶段都运行完成之后吗?这样的话,整个爬取结束后wget.out会填满吗?

如何让程序间歇性地写入磁盘,这样,即使爬取阶段中断,我也能保存一些输出?

【问题讨论】:

标签: linux shell pipe


【解决方案1】:

每个管道中都有缓冲,可能在每个程序的 stdio 层中。在最终的 grep 处理了足够多的行以使其缓冲区填满到溢出到磁盘的程度之前,数据不会进入磁盘。

如果你在命令行上运行你的管道,然后点击 Ctrl-Csigint 将被发送到每个进程,终止每个进程,然后丢失任何待处理的输出。

要么:

  1. 在除第一个进程之外的所有进程中忽略 sigint。 Bash 黑客技术如下:

    $ wget --spider --force-html -r -l2 http://example.com 2>&1 grep '^--' |
        {陷阱''int; awk '{ 打印 $3 }'; } |
        ∶
    
  2. 只需将键盘中断传递给第一个进程。以交互方式,您可以使用 jobs -lkill 发现 pid。 (在后台运行管道。)

    $工作-l [1]+ 10864 运行 wget 3364 跑步 | grep 13500 运行 | awk ∶ $杀死-int 10864
  3. 玩转disown bash 内置函数。

【讨论】:

    猜你喜欢
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 2018-07-07
    • 1970-01-01
    • 2021-12-16
    • 2013-08-20
    • 1970-01-01
    相关资源
    最近更新 更多