Como usar o parallel para paralelizar execução de comandos no terminal

1. Introdução ao GNU Parallel

O GNU Parallel é uma ferramenta de linha de comando que permite executar tarefas em paralelo de forma eficiente e controlada. Diferente de simplesmente colocar processos em background com &, o parallel gerencia inteligentemente a distribuição de carga, recursos do sistema e a ordem de saída.

Em uma execução sequencial tradicional, processamos um item por vez:

for arquivo in *.log; do
    gzip "$arquivo"
done

Isso utiliza apenas um núcleo da CPU. Com parallel, podemos distribuir o trabalho entre múltiplos núcleos:

parallel gzip ::: *.log

Para instalar o GNU Parallel:

  • Ubuntu/Debian: sudo apt install parallel
  • Fedora/RHEL: sudo dnf install parallel
  • Arch Linux: sudo pacman -S parallel
  • macOS (Homebrew): brew install parallel

2. Sintaxe básica e primeiros exemplos

A estrutura fundamental do parallel é:

parallel [opções] comando ::: argumentos

Exemplo básico — processar múltiplos arquivos:

parallel echo "Processando {}" ::: arquivo1.txt arquivo2.txt arquivo3.txt

Controlar o número de jobs simultâneos com -j:

parallel -j 2 gzip ::: *.log

Isso executa no máximo 2 compressões simultâneas, evitando sobrecarregar o sistema.

3. Modos de entrada de dados

Argumentos diretos com ::::

parallel echo "URL: {}" ::: site1.com site2.com site3.com

Lendo de arquivos com :::::

parallel wget {} :::: urls.txt

Usando pipe:

cat arquivos.txt | parallel gzip

Combinando fontes de dados:

parallel echo "Arquivo: {} - Diretório: {2}" ::: *.txt ::: ./backup ./temp

4. Substituição de placeholders e templates

O placeholder padrão {} representa o argumento atual. Variações úteis:

  • {.} — remove a extensão
  • {/} — apenas o nome base (sem diretório)
  • {//} — apenas o diretório
  • {%} — número do job (1, 2, 3...)

Exemplo prático com placeholders:

parallel "convert {} {.}.png" ::: *.jpg

Múltiplos placeholders para entradas combinadas:

parallel "cp {1} {2}/{1}" ::: *.txt ::: ./destino1 ./destino2

Usando --xapply para combinar listas paralelamente:

parallel --xapply "mv {1} {2}" ::: *.txt ::: renomear1.txt renomear2.txt

5. Opções avançadas de controle de execução

Limitar recursos do sistema:

# Não iniciar novo job se a carga do sistema > 4
parallel --load 4 gzip ::: *.log

# Não iniciar se memória livre < 500MB
parallel --memfree 500M gzip ::: *.log

# Executar com nice 19 (baixa prioridade)
parallel --nice 19 gzip ::: *.log

Reexecutar comandos com falha:

parallel --retries 3 wget {} ::: urls.txt

Controlar saída:

# Manter ordem de entrada na saída
parallel --keep-order "processar {}" ::: *.txt

# Buffer por linha (útil para logs)
parallel --line-buffer "analisar {}" ::: *.log

6. Paralelizando tarefas comuns do dia a dia

Compactação paralela:

# Com gzip
parallel -j 4 gzip ::: *.log

# Com bzip2 (compressão mais forte)
parallel -j 2 bzip2 ::: *.txt

Download simultâneo de URLs:

parallel -j 5 wget -q {} ::: http://exemplo.com/arquivo1.zip http://exemplo.com/arquivo2.zip

Processamento paralelo de logs:

# Grep paralelo em múltiplos logs
parallel -j 4 "grep -c 'ERROR' {}" ::: *.log

# Extrair campos específicos com awk
parallel -j 4 "awk '{print \$1, \$3}' {} > {.}.csv" ::: *.log

7. Integração com scripts e automação

Usando parallel dentro de scripts Bash:

#!/bin/bash
diretorios=$(ls -d /dados/cliente*/)
parallel -j 3 "cd {} && ./processar.sh" ::: $diretorios

Combinando com find:

find /logs -name "*.log" -mtime -7 | parallel gzip

Backup paralelo com rsync:

# Backup de múltiplos diretórios remotos
parallel -j 2 "rsync -avz {} usuario@servidor:/backup/{/}" ::: /dados/projeto1 /dados/projeto2 /dados/projeto3

Exemplo prático completo — redimensionar imagens em paralelo:

parallel -j 4 "convert {} -resize 800x600 {.}_thumb.jpg" ::: *.jpg

8. Boas práticas e resolução de problemas

Evitar sobrecarga do sistema:

# Usar -j com número de núcleos disponíveis
parallel -j $(nproc) comando ::: argumentos

# Ou usar --load para proteção dinâmica
parallel -j 0 --load 80% comando ::: argumentos

Depuração com --dry-run:

parallel --dry-run gzip {} ::: *.log
# Mostra os comandos que seriam executados sem executá-los

Usando --verbose:

parallel --verbose wget {} ::: urls.txt
# Mostra cada comando antes de executá-lo

Diferenças entre parallel e xargs -P:

Característica parallel xargs -P
Distribuição inteligente Sim Limitada
Placeholders flexíveis Sim Apenas básico
Controle de recursos Avançado Básico
Reexecução em falha Sim Não
Ordenação de saída Sim Limitado

Use parallel para tarefas complexas que exigem controle fino; use xargs -P para paralelismo simples e rápido sem instalação adicional.


O GNU Parallel é uma ferramenta poderosa que transforma scripts sequenciais em processos paralelos eficientes. Com as técnicas apresentadas, você pode acelerar significativamente tarefas repetitivas no terminal, desde processamento de arquivos até downloads e backups. Comece com exemplos simples, use --dry-run para testar e aumente gradualmente o paralelismo conforme necessário.

Referências