Como executar vários processos 'seriais' sob controle considerando as CPUs disponíveis? [duplicado]

1

Suponha que você tenha um binário que precisa ser executado em arquivos maaaaaaaaany (suponha que os arquivos sejam numerados de 1 a N). Cada arquivo tem que ser processado fazendo uma chamada para este binário (digamos .... algo como md5sum). Cada execução salvará o resultado em um arquivo separado. Então .... se tivermos 1000 arquivos e tivermos apenas 4 CPUs, não queremos fazer algo como (se possível, na verdade):

i=0; while [ $i -lt 1000 ]; do md5sum a_file_$i > result_$i & i=$(( $i + 1 )); done

Porque (mesmo que o bash não reclame), acabamos iniciando 1000 processos que farão o computador entrar no modo de rastreamento.

Existe um comando disponível que eu poderia usar onde eu posso dizer que o comando tem que ser executado como n processos de cada vez (iniciar n processos, monitora quando um processo termina e então inicia outro para que o número de processos executando é sempre n)?

    
por eftshift0 04.08.2017 / 04:36

1 resposta

2

O

GNU paralelo é a ferramenta que você está procurando. O autor, Ole Tange , é um regular aqui e escreveu várias boas respostas para questions about it

A versão do GNU de xargs de findutils também tem algumas opções para executar vários trabalhos em paralelo. É provavelmente mais fácil de usar para tarefas simples como a sua, mas nem de longe tão flexível ou capaz como parallel .

Por exemplo:

find . -maxdepth 1 -type f -name 'a_file_*' -print0 | 
  xargs -0r -L 1 -P 4 sh -c '/usr/bin/md5sum "$1" > "$1.md5sum"' {}

Isso executará até 4 md5sum trabalhos em paralelo ( -P 4 ). Eu também usei a opção -L 1 para limitar cada trabalho ao processamento de um nome de arquivo de cada vez - sem isso (caso contrário, ele só executaria 1 tarefa com 1000 nomes de arquivos)

    
por 04.08.2017 / 05:28