GNUパラレル:ホストごとに実行されるネットワーク操作の最大数を制限する方法

GNUパラレル:ホストごとに実行されるネットワーク操作の最大数を制限する方法

私はGNU Parallelを使用して(他のホストの)URLリストから脆弱性を検索します。次のようになります。

cat urls.txt | parallel --gnu -j 50 ./scan {}

「スキャン」プロシージャは、1つのスレッドで1つのURLに対して機能します。ホストごとの同時要求(ジョブ)の数を5つの接続に厳密に制限する必要があります。この目標をどのように達成できますか?

答え1

URLをホストごとに1つのファイルに分割します。次に、各ファイルに対して「parallel -j5」を実行します。

あるいは、新しいホストが見つかったら、URLをソートし、区切り文字「\ 0」を挿入してから「\ 0」に分割し、「\ 0」を削除しながら新しい並列インスタンスにチャンクとして渡します。

sort urls.txt | 
  perl -pe '(not m://$last:) and print "\0";m://([^/]+): and $last=$1' |
  parallel -j10 --pipe --rrs -N1 --recend '\0' parallel -j5 ./scan

編集する:

私はこれがうまくいくと思います:

cat urls.txt | parallel -q -j50 sem --fg --id '{= m://([^/]+):; $_=$1 =}' -j5 ./scan {}

semGNU Parallelの一部です(略語はparallel --semaphore)。{= m://([^/]+):; $_=$1 =}ホスト名を取得します。 5つのスロットを持つカウントセマフォを作成するように指示-j5します。バックグラウンドでジョブを作成しないように強制します。ホスト名をIDとして使用すると、ホスト名あたりのセマフォ数を取得できます。sem--fgsem

-qparallel一部のURLに特殊なシェル文字(例:&)が含まれている場合は、この文字を使用する必要があります。semシェルも拡張するので、シェル拡張から保護する必要があります。

関連情報