나는 URL 파일을 읽고 각 URL에 대한 HTTP 상태 코드를 출력하는 Debian 시스템에 스크립트를 작성했습니다.
...
while read url
do
urlstatus=$(curl -H 'Cache-Control: no-cache' -o /dev/null --silent --head --insecure --write-out '%{http_code} ; %{redirect_url}' "$url")
...
done < $1
100개의 URL이 포함된 파일에는 문제가 없지만 1000개가 넘는 URL이 포함된 큰 파일의 경우 스크립트가 매우 느려집니다!
SO에서 찾은 몇 가지 "팁"을 시도했습니다. KeepAlive 설정 -H 'Keep-Alive: 500'
, GoogleBot을 사용자 에이전트로 정의, --user-agent 'Googlebot/2.1 (+http://www.google.com/bot.html)'
연결 시간 초과 정의 등이 --connect-timeout 1
있었지만 아무것도 아닙니다!
답변1
병렬로 실행하려면 GNU Parallel을 사용할 수 있습니다.
#!/usr/bin/env bash
file=$1
status_func () {
local _url="${1:-/dev/stdin}"
local _urlstatus
_urlstatus=$(curl -H 'Cache-Control: no-cache' -o /dev/null --silent --head --insecure --write-out '%{http_code} ; %{redirect_url}' "$_url")
printf 'Status: %s\n' "$_urlstatus"
}
export -f status_func
cat "$file" | parallel -j20 status_func
-j 옵션은 최대 동시 작업 수를 설정합니다. 기본값은 시스템의 스레드 수이지만 최상의 결과를 얻으려면 이 수를 조정해야 할 수도 있습니다.
명령을 함수(또는 완전히 별도의 스크립트)에 추가하고 병렬 처리가 이를 알 수 있도록 함수를 내보내야 한다는 점에 유의하세요.
명령을 독립 실행형 스크립트에 넣으려면 다음과 같이 명령줄에서 실행할 수 있습니다.
cat "$file" | parallel -j20 ./my_script.sh
이 스크립트는 stdin을 통해 전송된 URL만 예상해야 합니다.
또는 GNU 병렬 처리를 사용할 수 없지만 여전히 여러 작업을 동시에 실행하려는 경우 해당 작업을 백그라운드 작업으로 실행할 수 있지만 동시 프로세스 수를 제한하고 싶을 가능성이 높습니다. 이는 다음을 통해 수행할 수 있습니다.
#!/usr/bin/env bash
file=$1
max_bg_procs () {
local max_number=$((0 + ${1:-0}))
while :; do
local current_number=$(jobs -pr | wc -l)
if [[ $current_number -lt $max_number ]]; then
break
fi
sleep 2
done
}
status_func () {
local _url="${1:-/dev/stdin}"
local _urlstatus
_urlstatus=$(curl -H 'Cache-Control: no-cache' -o /dev/null --silent --head --insecure --write-out '%{http_code} ; %{redirect_url}' "$_url")
printf 'Status: %s\n' "$_urlstatus"
}
while IFS= read -rd url; do
max_bg_procs 20
status_func "$url" &
done < "$file"
답변2
사용xargs -P0
seq 100 | xargs -I@ echo 'https://example.com?@' > urls.txt
cat urls.txt | xargs -P0 -n1 curl
얼마나 빨리?
아니요 -P0
:
time sh -c 'cat urls.txt | xargs -n1 curl'
real 0m 59.79s
user 0m 1.64s
sys 0m 0.99s
그리고 -P0
:
time sh -c 'cat urls.txt | xargs -P0 -n1 curl'
real 0m 0.76s
user 0m 1.26s
sys 0m 0.82s
인용 출처 man xargs
:
-P 최대 프로세스
병렬 모드: 한 번에 최대 maxprocs 유틸리티 호출을 실행합니다. maxprocs가 0으로 설정되면 xargs는 가능한 한 많은 프로세스를 실행합니다.
답변3
사용-Z
사용 사례에 따라 또 다른 잠재적인 솔루션은 -Z
플래그입니다. 이는 여러 URL을 제공 curl
하거나 curl
범위에 대해 작업할 특정 구문을 지정하여 컬이 페이지 매김과 같은 작업을 자동화하도록 할 때 유용합니다.
이 플래그에 대한 문서는 -Z
다음과 같습니다.https://curl.se/docs/manpage.html#-Z
특정 범위 구문에 대한 문서는 curl
다음 위치에 있습니다.https://curl.se/docs/manpage.html및 ^F '와일드카드'.
curl -Z $(cat urls.txt | xargs)