이는 도메인과 해당 매개변수를 사용하여 상태 코드를 찾는 쉘 스크립트입니다. 스레드로 인해 더 빠르게 실행되지만 많은 요청이 누락됩니다.
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 목록 등)를 전달할 수 있습니다. 우리는 백그라운드 트래픽을 생성할 때 특정 네트워크 조건을 시뮬레이션하기 위해 이러한 명령을 자주 사용합니다.