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

답변2

여러 개를 실행할 수 있지만프로세스셸에서 비동기적으로(" shellcmd &" 구문 활용) 하위 프로세스는 다음 명령이 출력을 캡처하기 전에 종료될 수 있으며 종종 종료됩니다. 그리고 @Ole-Tange가 지적했듯이 이 출력이 올바른 순서로 파일에 기록되는지 확인할 방법이 없습니다!

많은 사람들이 쉘 스크립트를 사용하는 대신 여러 스레드를 관리하기 위해 다른 스크립팅 언어를 사용하기를 원합니다.

답변3

여러 컬 전송을 병렬로 수행하려면 xargs라는 다른 도구를 고려해야 합니다.

xargs에 익숙하지 않다면 이는 매우 강력한 Linux 유틸리티입니다. 이를 통해 우리는 약간의 오버헤드로 여러 개의 (동적) 컬 명령을 병렬로 실행할 수 있습니다. 예:

seq 1 3 | xargs -n1 -P3 bash -c 'i=$0; url="http://mytestserver.net/10m_test.html?run=${i}"; curl -O -s $url'

이 코드는 3개의 컬 명령을 병렬로 실행합니다. -P 매개변수를 사용하면 원하는 병렬 실행 수를 설정할 수 있습니다. 이 예에서는 seq 명령을 사용하여 각 URL이 고유한 실행 번호를 갖도록 명령에 숫자 인수를 전달합니다. -n 매개변수는 단순히 실행당 전달되는 매개변수 수를 제한합니다. -c 매개변수는 실행할 명령을 지정하는 곳입니다.

이 예시는 출력을 제공하지 않고 전송만 실행한다는 점에 유의하세요. 출력을 저장하려는 경우 출력 형식에 대한 이전 설명을 사용하여 출력할 내용과 저장 방법을 결정할 수 있습니다.

여기에서 반복 횟수를 늘리고 다른 흥미로운 매개변수(파일의 URL 목록 등)를 전달할 수 있습니다. 우리는 백그라운드 트래픽을 생성할 때 특정 네트워크 조건을 시뮬레이션하기 위해 이러한 명령을 자주 사용합니다.

관련 정보