如何跨管道处理数据?

时间:2011-01-24 11:04:41

标签: linux shell pipe

我使用了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会填满吗?

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

1 个答案:

答案 0 :(得分:1)

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

如果在命令行上运行管道,然后按 Ctrl - C sigint将被发送到每个进程,终止每个进程,并且丢失任何未决的输出。

或者:

  1. 忽略所有进程中的sigint,但第一个进程。 Bash hackery如下:

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

    $ jobs -l
    [1]+ 10864 Running          wget
       3364 Running             | grep
      13500 Running             | awk
    ∶
    $ kill -int 10864
    
  3. 使用disown bash内置游戏。