2011-01-24 18 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

答えて

1

各パイプにバッファリングがあり、各プログラムのstdioレイヤーにバッファリングがあります。最終的なgrepが十分な行を処理してバッファーがディスクに書き込まれるまでいっぱいになるまで、データはディスクに書き込まれません。

あなたは、コマンドライン上のあなたのパイプラインを実行し、Ctrlキーをヒットした場合 - Csigintは、それぞれを終了、すべてのプロセスに送信され、保留中の出力を失うことになります。

次のいずれかの

  1. は、すべてのプロセスでsigintを無視したが最初。バッシュハッカーは次のとおりです。

    $ wget --spider --force-html -r -l2 http://example.com 2>&1 grep '^--' | 
        { trap '' int; awk '{ print $3 }'; } | 
        ∶ 
    
  2. キーボード割り込みを最初のプロセスに渡すだけです。対話的に、あなたはjobs -lとしてkillとpidを見つけることができます。 (バックグラウンドでのパイプラインを実行します。)disown、bashの組み込みと周りの再生

     
    $ jobs -l 
    [1]+ 10864 Running   wget 
        3364 Running    | grep 
        13500 Running    | awk 
    ∶ 
    $ kill -int 10864 
    
関連する問題