다음 bash 스크립트가 있습니다(이 게시물에):
#!/bin/bash
while read LINE; do
curl -o /dev/null --silent --head --write-out "%{http_code} $LINE\n" "$LINE"
done < infile > outfile
입력 파일:
google.com
facebook.com
결과물 파일:
301 amazon.com
302 facebook.com
질문:한 줄씩 확인하기 때문에 매우 느립니다.
시험:나는 다음과 같은 다른 대안을 시도했습니다.평평한(목록의 크기를 고려하면 매우 제한적임)멋진(꼭 매달리게 하다),얻다,GNU 병렬잠깐, 그들 중 누구도 나를 설득하지 못했습니다. 그리고여기xargs를 사용하는 솔루션이지만 출력이 원래 스크립트와 다릅니다
질문:여러 행을 동시에 처리할 수 있도록 이 스크립트를 사용하여 여러 쿼리(병렬 처리)를 시작하려면 어떻게 해야 합니까(스크립트나 PC가 정지되거나 차단되는 것을 방지하면서 처리할 행 수를 수동으로 설정할 수 있는 경우)?
고쳐 쓰다:해결되었습니다! . 감사해요
cat infile | xargs -I {} -P3 curl {} -o /dev/null --silent --head --write-out "%{http_code} {}\n" > outfile
PD: "-P 3" 인스턴스 번호
답변1
왜냐하면https://mywiki.wooledge.org/BashPitfalls#Non-atomic_writes_with_xargs_-P(병렬 작업의 출력이 혼합될 위험이 있습니다 xargs
.) 대신 GNU Parallel을 사용하겠습니다.
cat infile |
parallel -P0 -q curl {} -o /dev/null --silent --head --write-out "%{http_code} {}\n" > outfile
xargs
이 특별한 경우에는 출력이 짧기 때문에 사용해도 안전할 수 있습니다 . 따라서 이를 사용하는 데 따른 문제 xargs
는 나중에 누군가가 더 큰 작업을 수행하기 위해 코드를 변경하면 더 이상 안전하지 않다는 것입니다. 또는 누군가가 이 질문을 읽고 이를 다른 것으로 대체할 수 있다고 생각한다면 curl
그것도 안전하지 않을 수 있습니다.
이것이 더 빠를 수도 있습니다:
doit() {
while read LINE; do
curl -o /dev/null --silent --head --write-out "%{http_code} $LINE\n" "$LINE"
done
}
export -f doit
parallel -j0 --pipepart -a infile --block -10 doit > outfile
답변2
URL 목록을 10개 부분으로 분할하고 기본 스크립트를 사용할 수 있습니다.
./subscript1.sh &
./subscript2.sh &
...
./subscript10.sh &
병렬로 실행하십시오. 참고: 서로 다른 로그 파일을 사용해야 합니다.