터미널 내의 여러 링크에 대해 동일한 명령을 실행합니다.

터미널 내의 여러 링크에 대해 동일한 명령을 실행합니다.

많은 링크가 포함된 파일이 있습니다. 예를 들어, 이것은 내 파일입니다.

link1
link2
link3
link4
link5
link6
link7
link8
link9
link10
link11
link12
link13
link14
link15
link16

첫 번째 4개 링크를 동시에 실행하는 단일 터미널에서 특정 명령을 실행하고 싶습니다. 예를 들어 내가 실행하려는 명령은 다음과 같습니다.

wget link1
wget link2

잠깐만요..하지만 처음 4개의 링크를 동시에 실행하고 싶습니다. 그런 다음 링크 중 하나의 다운로드가 완료되면 다음 링크(예: link5)가 다운로드를 위해 자동으로 제출되어야 합니다.

링크를 하나씩 다운로드하거나(더 많은 시간 사용) 여러 터미널을 열어 여러 개별 링크를 별도의 명령으로 제출할 필요가 없는 방법을 찾고 있습니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변1

GNU 병렬성을 사용할 수 있습니다.

parallel --retries 5 -j4 -a file.txt wget {}

그러면 한 번에 4개의 작업이 실행되고 에서 입력을 읽습니다 file.txt. 작업이 실패하면 다음 작업을 계속하기 전에 최대 20번까지 재시도합니다.

답변2

xargs다음을 구현 하여 여러 작업을 병렬로 실행하는 옵션 -P: (가장 일반적인 구현):

xargs -I {} -P 4 wget --quiet {} <file.txt

행위아니요 xargs또는 GNU parallel이지만 다음을 사용하십시오 bash.

#!/bin/bash

jobs=0
while read -r url; do
    if [ "$jobs" -ge 4 ]; then
        wait -n
        jobs=$(( jobs - 1 ))
    fi

    wget --quiet "$url" &
    jobs=$(( jobs + 1 ))
done <file.txt

wait

이렇게 하면 wget해당 작업 4개가 시작될 때까지 가능한 한 빨리 백그라운드 작업이 시작됩니다. 그런 다음 wait -n다음 작업을 시작하기 전에 둘 중 하나가 끝날 때까지 기다립니다 . 이 jobs변수는 현재 실행 중인 작업 수를 보유합니다 wget.

wait마지막으로 모든 작업이 완료될 때까지 단일 호출이 차단됩니다.

이것이 일반 스크립트가 아닌 스크립트로 wait -n만드는 것 입니다 .bash/bin/sh

답변3

모든 답변이 잘 사용되고 작동하는 동안 parallel소개 xargs하겠습니다.GNU Wget2.이는 Wget의 다음 버전이며 아직 알파 모드이지만 대부분의 Wget 사용을 즉시 대체합니다.

Wget2는 멀티스레드 다운로드를 지원하므로 병렬로 다운로드할 파일 수와 파일 수만 입력하면 나머지는 Wget2가 처리하게 됩니다.

출처: GNU Wget 및 GNU Wget2의 관리자입니다.

관련 정보