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
- GNU Parallel Official Documentation — Documentação completa do GNU Parallel, incluindo manual, tutorial e exemplos oficiais
- GNU Parallel Tutorial — Tutorial oficial passo a passo cobrindo desde o básico até técnicas avançadas
- Using GNU Parallel for Batch Processing — Artigo prático da Linux.com sobre processamento em lote com parallel
- GNU Parallel Cheat Sheet — Folha de referência rápida com os comandos e opções mais usados do GNU Parallel
- Parallel Processing in Bash with GNU Parallel — Tutorial da Baeldung abordando processamento paralelo em Bash com exemplos práticos
- GNU Parallel - Advanced Usage — Artigo da Admin Magazine focado em usos avançados e otimização de desempenho
- Parallel vs xargs -P: When to Use Each — Comparação oficial entre GNU Parallel e alternativas como xargs -P