사용xargs -P0

사용xargs -P0

나는 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)

관련 정보