Correndo até comandos X em paralelo

3

Estou executando algo assim:

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

Isso funciona muito bem, mas parece que o GPG não está otimizado para usar vários núcleos em uma operação de criptografia. Os arquivos que estou criptografando têm cerca de 2 GB e eu tenho um pouco deles. Gostaria de poder executar tarefas X em paralelo para criptografar os arquivos e, em seguida, removê-los. Como posso fazer isso, definindo um limite para, digamos, 8 trabalhos por vez?

    
por Naftuli Kay 24.06.2013 / 18:49

3 respostas

4

Se você instalar a ferramenta GNU Parallel , poderá fazer um trabalho muito fácil com o que está tentando realizar:

$ 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 "{}"                       \
      '

detalhes

O acima está pegando a saída de find e passando para parallel e executando 8 de cada vez. Em todos os lugares, a ocorrência de {} dos nomes de arquivos que estão sendo transmitidos de find substituirá o {} nesses pontos.

Referências

por 24.06.2013 / 19:25
4

Você pode querer analisar o gnu paralelo e sua opção --semaphore . Da documentação:

--semaphore

Work as a counting semaphore. --semaphore will cause GNU parallel to start command in the background. When the number of simultaneous jobs is reached, GNU parallel will wait for one of these to complete before starting another command.

Você usa --jobs 8 para limitar o número de trabalhos a 8. Você pode canalizar a saída de classificação para parallel , como faria com xargs . sem é um alias para parallel --semaphore

    
por 24.06.2013 / 19:20
0

Eu escrevi um script Perl fácil de usar que permite controlar o número máximo de comandos que são executados ao mesmo tempo: link

Pode ser interessante para você.

    
por 01.02.2019 / 12:11