2011-01-24 53 views
0

我使用这个命令行程序,我在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

可能重复[关闭管道中的缓冲](http://stackoverflow.com/questions/1000674/turn-off-buffering-in-pipe) – eumiro 2011-01-24 11:10:40

回答

1

在每个管道中都有缓冲,也可能在每个程序的stdio层中有缓冲。直到最终的grep处理足够的行以使其缓冲区填充到溢出到磁盘的位置时,数据才会将其写入磁盘。

如果您运行的命令行管道,然后打按Ctrl - Ç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。 (在后台运行的管道。)

     
    $ jobs -l 
    [1]+ 10864 Running   wget 
        3364 Running    | grep 
        13500 Running    | awk 
    ∶ 
    $ kill -int 10864 
    
  3. disown bash的内置玩耍。