병렬 명령이 "시작 중"과 "완료"를 모두 인쇄하는 이유는 무엇입니까?

병렬 명령이 "시작 중"과 "완료"를 모두 인쇄하는 이유는 무엇입니까?
ls *.txt | parallel 'echo Starting on file {}; mkdir {.}; cd {.}; longCMD3 ../{} > /dev/null; echo Finished file {}'

이 라이너는 부분적으로 작동합니다. 단, longCMD3은 약 3분이 소요되지만 첫 번째와 두 번째 echo 명령은 거의 동시에 인쇄됩니다. 넣어보았습니다

wait

Last Echo 이전이지만 아무런 차이가 없습니다.

longCMD3가 완료된 후에만 최종 에코가 인쇄되도록 하려면 어떻게 해야 합니까?

이것은 예이다

코어가 4개만 있다고 가정해 보겠습니다.

ls
foo1.txt foo2.txt foo3.txt foo4.txt foo5.txt foo6.txt 

내가 기대한 것:

Starting on file foo1.txt
Starting on file foo2.txt
Starting on file foo3.txt
Starting on file foo4.txt

그러면 longCMD3가 파일 중 하나를 완료하는 데 최소 2분이 걸립니다.

Finished file foo1.txt
Starting on file foo5.txt

하지만 내가 얻는 것은 다음과 같습니다.

Starting on file foo1.txt
Finished file foo1.txt
Starting on file foo2.txt
Finished file foo2.txt
Starting on file foo3.txt
Finished file foo3.txt
Starting on file foo4.txt
Finished file foo4.txt

이는 6개 파일 모두에 해당됩니다. 각 파일의 시작 및 완료 문이 동시에 인쇄됩니다. 그러나 각 파일 사이에는 몇 분이 걸립니다.

답변1

echo Starting on file foo.txt각 파일에 대해 , mkdir foo및 명령은 cd foo순차적으로 실행됩니다. 즉, 각 명령은 이전 longCMD3 ../foo.txt > /dev/null명령이 echo Finished file foo.txt완료된 후에 시작됩니다.

다양한 파일에 대한 명령이 흩어져 있습니다. 기본적으로 병렬 명령은 코어 수만큼 많은 작업을 병렬로 실행합니다.

하지만, 그산출기본적으로 명령은 확산되지 않습니다. 이것이 바로 여러 개의 "시작" 줄이 표시되지 않고 그에 상응하는 "완료" 줄이 표시되지 않는 이유입니다. 각 작업의 출력을 병렬로 그룹화합니다. 작업이 완료될 때까지 출력을 버퍼링합니다. --group이 옵션에 대한 설명은 설명서를 참조하세요 . 귀하의 경우에는 그룹화가 적합하지 않으므로 --ungroup( -u) 옵션을 사용하여 끄거나 를 사용하여 행 그룹화로 전환하십시오 --line-buffer.

기타 수정사항:

  • ls 구문 분석이 신뢰할 수 없습니다.. 파일 이름을 직접 전달하십시오 parallel.
  • mkdir실패 하면 계속하면 안 됩니다. 명령이 실패하면 작업이 실패하도록 예약해야 합니다. 간단한 방법은 작업 스크립트를 시작하는 것입니다.set -e.
parallel --line-buffer 'set -e; echo Starting on file {}; mkdir {.}; cd {.}; longCMD3 ../{} > /dev/null; echo Finished file {}' ::: *.txt

관련 정보