최대 X개의 명령을 병렬로 실행

최대 X개의 명령을 병렬로 실행

나는 다음과 같은 것을 실행하고 있습니다 :

find . -maxdepth 1 -type f -note -iname "*.gpg" | sort | while read file ; do
    echo "Encrypting $file..."
    gpg --trust-model always --recipient "[email protected]" --output "$file.gpg" \
        --encrypt "$file" && rm "$file" 
done

이것은 잘 작동하지만 GPG는 암호화 작업에 다중 코어를 사용하는 데 최적화되지 않은 것 같습니다. 제가 암호화하고 있는 파일은 크기가 2GB 정도인데, 파일이 꽤 많아요. X 작업을 병렬로 실행하여 파일을 암호화한 다음 삭제할 수 있기를 원합니다. 예를 들어 한 번에 8개의 작업을 제한하려면 어떻게 해야 합니까?

답변1

설치하면GNU 병렬달성하려는 작업을 쉽게 수행할 수 있는 도구:

$ find . -maxdepth 1 -type f -note -iname "*.gpg" | sort | \
      parallel --gnu -j 8 --workdir $PWD '                 \
         echo "Encrypting {}...";                          \
         gpg --trust-model always                          \
           --recipient "[email protected]" --output "{}.gpg"   \
           --encrypt "{}" && rm "{}"                       \
      '

세부 사항

위의 코드는 출력을 가져와서 find로 실행 parallel하고 한 번에 8개씩 실행합니다. {}전달되는 파일 이름은 모든 곳에 표시되며 이 위치에 있는 find파일 이름을 대체합니다 .{}

인용하다

답변2

한 번 살펴보고 싶을 수도 있습니다 GNU 병렬그리고 그 --semaphore옵션. 문서에서:

- 시그널

카운팅 세마포어로 사용됩니다. --semaphore는 GNU가 백그라운드에서 병렬로 명령을 실행하도록 합니다. 동시 작업 수에 도달하면 GNU Parallel은 다른 명령을 실행하기 전에 작업 중 하나가 완료될 때까지 기다립니다.

--jobs 8작업 수를 8개로 제한 할 수 있습니다 . parallel를 사용하는 것처럼 sort의 출력을 로 파이프할 수 있습니다 xargs. sem별칭입니다parallel --semaphore

답변3

동시에 실행되는 최대 명령 수를 제어하는 ​​사용하기 쉬운 Perl 스크립트를 작성했습니다.https://github.com/matmu/parallelize_cmds

당신은 관심이 있을 수도 있습니다.

관련 정보