2011-01-24 59 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的內置玩耍。