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