xargs를 사용하여 병렬로 프로그램 실행


85

현재 스크립트가 있습니다.

#!/bin/bash
# script.sh

for i in {0..99}; do
   script-to-run.sh input/ output/ $i
done

xargs를 사용하여 병렬로 실행하고 싶습니다. 나는 시도했다

script.sh | xargs -P8

그러나 위의 작업은 한 번에 한 번만 실행됩니다. -n8도 운이 없습니다. 스크립트 for 루프에서 실행할 행 끝에 &를 추가하면 스크립트를 한 번에 99 번 실행하려고 시도합니다. 한 번에 8 개, 총 100 개까지만 루프를 실행하는 방법은 무엇입니까?


이것이 제가 처음에하고 싶었던 일이지만 Windows를 사용하고 있기 때문에 xargs에 의존해야했습니다. Windows에서 GNU Parallel을 실행할 수 없었습니다
Olivier

그 스크립트가 자신을 부르고 있습니까? 아니면 여기에서 물었을 때 이름을 혼동 했습니까?
Etan Reisner 2015

죄송합니다. 다른 스크립트를 호출해야합니다. 나는 그것을 해결됩니다
올리비에

stackoverflow.com/questions/3321738/…에 대한 답변 은 여기와 관련이 있습니다.
Etan Reisner 2015

답변:


128

로부터 xargs매뉴얼 페이지

이 매뉴얼 페이지는 xargs의 GNU 버전을 문서화합니다. xargs는 공백 (큰 따옴표 또는 작은 따옴표 또는 백 슬래시로 보호 될 수 있음) 또는 줄 바꿈으로 구분 된 표준 입력에서 항목을 읽고 그 뒤에 오는 모든 initial- 인수와 함께 명령 (기본값은 / bin / echo)을 한 번 이상 실행합니다. 표준 입력에서 읽은 항목별로. 표준 입력의 빈 줄은 무시됩니다.

즉, 예제 xargs의 경우 스크립트에서 모든 출력을 기다리고 수집 한 다음 echo <that output>. 그다지 유용하지도 않고 원하는 것이 아닙니다.

-n인수는 입력으로부터 많은 항목이 (여기 병렬 처리에 대해, 그 자체로, 아무것도)를 실행하지됩니다 각 명령을 사용하는 방법입니다.

당신이 원하는 것을하기 위해서는 다음 xargs과 같은 것을해야 할 것입니다.

printf %s\\n {0..99} | xargs -n 1 -P 8 script-to-run.sh input/ output/

이렇게 분해됩니다.

  • printf %s\\n {0..99}-에서 0까지 한 줄에 하나씩 번호를 인쇄 합니다 99.
  • 운영 xargs
    • 복용 대부분에서 실행 명령 한 줄에 하나씩 인수
    • 한 번에 최대 8 개의 프로세스 실행

7
실제로 인수를 별도의 줄에 넣을 필요는 없습니다. xargs 단어 분할. 그래서 echo {0..99} |잘 작동합니다. <<<{0..99}작동하지 않는 것 같습니다. <<<word중괄호 확장 단어로 문서화되어 있지만 내가 편리한 bash 버전에서는 그렇게하지 않습니다.
rici

1
@rici 여기에 문서에 대한 문서는 다음 특히 이후 문서 버그처럼 보이는 하지 않습니다 그들도 발생하지 않는 (확장 물결 언급하지 않는 불구하고 중괄호 확장을 언급 (그리고 빠른 테스트 중 하나가 발생하지 않습니다) 대한 <<하지만 것은의 경우와 <<<너무 *shrug*). 여기 문서와 여기 문자열에서 일어나지 않는 확장은 내 마음에 약간 이상합니다.
Etan Reisner 2015

1
예를 들어 개행 문자를 사용하여 다른 실행의 결과를 어떻게 분리 할 수 ​​있습니까?
nirvana-msu

3
데모 : time head -12 <(yes "1") | xargs -n1 -P4 sleep12 개 sleep 1명령, 4 개 병렬 실행 . 이 명령은 3 초가 걸립니다.
Walter A

66

GNU Parallel을 사용하면 다음을 수행 할 수 있습니다.

parallel script-to-run.sh input/ output/ {} ::: {0..99}

CPU 코어 당 하나의 작업을 실행 -P8하지 않으 려면 추가하십시오 .

반대로 xargs입력에 공백, '또는 "(여기서는 해당되지 않음)이 포함되어 있어도 올바른 작업을 수행합니다. 또한 다른 작업의 출력이 함께 혼합되지 않도록하므로 출력을 사용하면 두 가지 다른 직업에서 반 라인을 얻지 못할 것입니다.

GNU Parallel은 일반적인 병렬 처리기이며 동일한 시스템 또는 ssh 액세스 권한이있는 여러 시스템에서 병렬로 작업을 쉽게 실행할 수 있습니다.

4 개의 CPU에서 실행하려는 32 개의 다른 작업이있는 경우 병렬화하는 간단한 방법은 각 CPU에서 8 개의 작업을 실행하는 것입니다.

간단한 스케줄링

대신 GNU Parallel은 하나가 완료되면 새 프로세스를 생성하여 CPU를 활성 상태로 유지하여 시간을 절약합니다.

GNU 병렬 스케줄링

설치

GNU Parallel이 배포 용으로 패키징되지 않은 경우 루트 액세스가 필요하지 않은 개인 설치를 수행 할 수 있습니다. 다음을 수행하여 10 초 내에 완료 할 수 있습니다.

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 67bd7bc7dc20aff99eb8f1266574dadb
12345678 67bd7bc7 dc20aff9 9eb8f126 6574dadb
$ md5sum install.sh | grep b7a15cdbb07fb6e11b0338577bc1780f
b7a15cdb b07fb6e1 1b033857 7bc1780f
$ sha512sum install.sh | grep 186000b62b66969d7506ca4f885e0c80e02a22444
6f25960b d4b90cf6 ba5b76de c1acdf39 f3d24249 72930394 a4164351 93a7668d
21ff9839 6f920be5 186000b6 2b66969d 7506ca4f 885e0c80 e02a2244 40e8a43f
$ bash install.sh

다른 설치 옵션은 http://git.savannah.gnu.org/cgit/parallel.git/tree/README를 참조하십시오.

더 알아보기

더 많은 예보기 : http://www.gnu.org/software/parallel/man.html

소개 동영상보기 : https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

자습서 살펴보기 : http://www.gnu.org/software/parallel/parallel_tutorial.html

지원을 받으려면 이메일 목록에 등록하십시오 : https://lists.gnu.org/mailman/listinfo/parallel


19
이것은 질문에 대한 답이 아니며 xargs가 동일한 결과를 얻을 수없는 이유를 지적하지도 않습니다.
张实唯

8
나를 위해 xarg가 두 번째 그림이 보여주는 것과 똑같기 때문에 반대 투표하십시오.
noonex

3
@noonex 모든 사람이 사용하는 xargs 버전을 사용하는 것은 아니며 -P가 모든 xargs 버전에 포함되어 있지 않다는 것을 알고 있습니까?
Ole Tange

19
아마도 모든 사람들 이이 답변이 GNU parallel의 저자에 의해 제공된다는 것을 알고있는 것은 아닙니다.
izkeros

1
대부분의 스크립트를 엉망으로 만드는 대화 형 프롬프트로 인해 첫 번째 시도에서 설명한대로 올바르게 실행되지 않는 소프트웨어에 대한 명확한 광고로 인해 비추천되었습니다.
Daniel Sorichetti
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.