Curl コマンドの Bash スクリプトのマルチスレッド

Curl コマンドの Bash スクリプトのマルチスレッド

これは、ドメインとそのパラメータを使用してステータスコードを見つけるシェルスクリプトです。スレッドにより速く実行されますが、多くの要求がありません。

while IFS= read -r url <&3; do
    while IFS= read -r uri <&4; do
    urlstatus=$(curl -o /dev/null --insecure --silent --head --write-out  '%{http_code}' "${url}""${uri}" --max-time 5 ) &&
    echo "$url  $urlstatus $uri" >> urlstatus.txt &
done 4<uri.txt 
done 3<url.txt

正常に実行するとすべての要求を処理しますが、非常に遅くなります。スピードを維持しながらすべてのリクエストを見逃さない方法はありますか?

ベストアンサー1

ファイルを並列に追加する際に問題があります。簡単な答えは:しないでください。

GNUパラレルを使用する方法は次のとおりです。

doit() {
    url="$1"
    uri="$2"
    urlstatus=$(curl -o /dev/null --insecure --silent --head --write-out  '%{http_code}' "${url}""${uri}" --max-time 5 ) &&
    echo "$url  $urlstatus $uri"
}
export -f doit

parallel -j200 doit :::: url uri >> urlstatus.txt

GNU Parallel はデフォルトで出力をシリアライズするため、あるジョブの出力が別のジョブの出力と混在することはありません。

GNU Parallelを使用すると、入力を出力に簡単に含めることができます--tag。したがって、出力形式が固定されていない場合は、次のようにします。

parallel --tag -j200 curl -o /dev/null --insecure --silent --head --write-out  '%{http_code}' {1}{2} --max-time 5 :::: url uri >> urlstatus.txt

異なる形式で同じ出力を提供します。変える:

url  urlstatus uri

あなたは以下を得ます:

url uri urlstatus

おすすめ記事