Monitorar progresso de cópias e transferências no Linux com pv e progress

Por que isso importa
Copiar arquivos grandes pelo terminal pode parecer que “parou” mesmo quando o sistema está trabalhando. Em interfaces gráficas vemos uma barra de progresso; no terminal, pv e progress servem para preencher essa lacuna. Eles mostram tempo decorrido, taxa de transferência, total movido e ETA, tornando operações longas previsíveis e menos estressantes.
Importante: todos os comandos e exemplos foram testados em distribuições Debian/Ubuntu. Preserve privilégios e paths originais ao executar exemplos.
Sumário rápido
- pv: monitora dados que passam por um pipe. Requer inserir pv na cadeia de comandos. Útil em pipes, compressão e redirecionamentos.
- progress: monitora processos já em execução (especialmente utilitários do coreutils como cp, mv, dd, tar). Não exige modificar o comando original.
pv: monitorando fluxos via pipe
O utilitário pv (pipe viewer) monitora o fluxo de dados através de um pipe. Ele mostra informações como tempo decorrido, barra de progresso, taxa atual, total transferido e ETA. A ideia é simples: coloque pv entre dois processos e ele passará os bytes adiante enquanto imprime o progresso no stderr.
Instalação (Debian/Ubuntu):
sudo apt-get install pv
Exemplo básico — copiar arquivos e comprimir com gzip enquanto vê o progresso:
pv -p /media/himanshu/1AC2-A8E3/Maldives-2016/* | gzip > ./Desktop/trip-pictures.gz
Explicação rápida dos switches úteis do pv:
- -p : mostra apenas a barra de progresso
- -t : mostra o tempo decorrido
- -e : mostra ETA (tempo estimado restante)
- -r : mostra a taxa de transferência atual
- -L
: limita a taxa (ex: -L 5m = ~5 MiB/s) - -s
: informa o tamanho total (útil para porcentagem correta quando pv não consegue inferir) - -W ou –wait : aguarda o primeiro byte antes de calcular ETA (útil com processos que demoram a iniciar)
Exemplo para limitar largura de banda a 5 MiB/s (útil para não saturar uma USB lenta):
pv -L 5m /media/himanshu/1AC2-A8E3/Maldives-2016/* | gzip > ./Desktop/trip-pictures.gz
Exemplo com dd para ver progresso de cópia de bloco:
dd if=/dev/sdb | pv -s 16G | dd of=/dev/sdc
No exemplo acima você pode passar -s com o tamanho esperado para obter porcentagem.
Quando usar pv
- Pode editar o comando que inicia a transferência.
- Excelente para pipelines (tar | pv | gzip, pv | ssh user@host ‘cat > file’).
Quando pv pode falhar ou ser limitado
- Se você não puder alterar o comando em execução (por exemplo, já iniciou cp interativo), pv não ajuda.
- Em operações extremamente bufferizadas (alguns caches), a progressão pode parecer irregular.
progress: monitorando processos já ativos (coreutils)
O Progress (antigo cv) detecta operações de ferramentas comuns do sistema (cp, mv, dd, gzip/gunzip, tar, cat, etc.) e mostra barras e estimativas sem precisar reexecutar o comando. É uma boa opção quando você não quer ou não pode modificar o comando que iniciou a transferência.
Pré‑requisito (ncurses) e instalação (Debian/Ubuntu):
sudo apt-get install libncurses5-dev
Clonar e instalar (do repositório oficial):
git clone https://github.com/Xfennec/progress.git
cd progress
make
sudo make install
A execução simples mostra todas as atividades monitoráveis:
Opções úteis do progress:
- -m, –monitor : repete enquanto houver processos monitorados
- -M, –monitor-continuously : monitora continuamente (similar ao watch)
- -c, –command cmd : monitore somente por nome de comando (pode repetir)
- -p, –pid id : monitore só esses PIDs (pode repetir)
- -i, –ignore-file file : ignore operações sobre este arquivo
Quando usar progress
- Você já executou um cp/mv/dd/tar e quer ver o progresso sem reexecutar.
- Cenários de diagnóstico onde quer ver múltiplos processos em uma visão tipo top.
Limitações do progress
- Focado em utilitários comuns; programas proprietários ou customizados podem não aparecer.
- Em alguns casos, nomes de arquivos sensíveis podem ficar visíveis — veja a seção de privacidade abaixo.
Alternativas e abordagens complementares
- rsync –progress ou rsync –info=progress2: para transferências locais ou remotas com reinício e verificação de integridade. Excelente para sincronizar diretórios grandes.
- scp/ssh combinados com pv: enviar um arquivo com pv através de ssh preservando a progressão:
pv bigfile | ssh user@host 'cat > /dest/bigfile'
dd status=progress: versões recentes do dd (coreutils) suportam status=progress para ver progresso sem pv.
Ferramentas gráficas (Nautilus, Dolphin) quando tiver ambiente gráfico.
Mini‑metodologia: escolher a ferramenta certa
- Posso editar o comando original?
- Sim: prefira pv (insira no pipe).
- Não: use progress.
- Preciso de reinício/consistência e rede?
- Sim: prefira rsync com –progress/–info=progress2.
- Preciso limitar banda?
- Use pv -L ou tc/ionice para controlar impacto.
Mermaid: fluxo decisório simples
flowchart TD
A[Precisa ver progresso?] --> B{Pode alterar o comando?}
B -- Sim --> C[Usar pv no pipe]
B -- Não --> D[Usar progress]
C --> E{É rede/remoto?}
E -- Sim --> F[Usar pv | ssh ou rsync --progress]
E -- Não --> G[pv com -s/-L conforme necessário]
D --> H{Comando é coreutils suportado?}
H -- Sim --> I[progress -m]
H -- Não --> J[Ver logs ou reiniciar com pv]
Cheklist por função
Usuario comum / Desktop
- Prefiro GUI? Use gerenciador de arquivos.
- Linha de comando: rsync –progress para pastas.
- Para um único arquivo via terminal: pv | gzip ou pv | ssh.
Desenvolvedor / Power user
- Se puder ajustar pipeline, adicione pv e -s quando possível.
- Para testes de desempenho, combine pv -r -b com medidas de I/O.
Administrador / Sysadmin
- Use progress para monitorar múltiplos processos de transferência em servidores sem alterar comandos existentes.
- Combine pv/rsync com ionice/tc para priorização.
Snippets e atalho (cheat sheet)
- Instalação rápida:
sudo apt-get install pv
- Copiar pasta e mostrar só a barra:
tar cf - /path/to/dir | pv -p -s 4G | tar xf - -C /dest
- Cópia pela rede com limite de banda:
pv -L 2m bigfile | ssh user@host 'cat > /dest/bigfile'
- Monitorar processos já em execução (modo contínuo):
progress -M
- Monitorar apenas um PID:
progress -p 12345
Testes e critérios de aceitação (simples)
Caso de teste 1: copiar arquivo de 5 GiB localmente com pv + gzip
- Critério: aparece barra de progresso, taxa e ETA condizentes com velocidade observada.
Caso de teste 2: iniciar cp de múltiplos arquivos grandes e rodar progress
- Critério: progress lista o cp e mostra taxa/ETA para cada operação detectada.
Caso de teste 3: transferir via ssh com pv
- Critério: transferência ocorre e pv exibe taxa conforme bytes transmitidos.
Quando nenhuma das opções ajuda (contraexemplos)
- Processos proprietários ou binários que não usam chamadas de I/O padrão podem não ser detectados.
- Operações que ficam bloqueadas por locks de sistema de arquivos não terão progresso real até o desbloqueio.
- Em sistemas com problemas de /proc (singularidades do kernel ou containers muito restritos), progress pode falhar em listar processos.
Privacidade e segurança
- progress pode expor nomes de arquivos e caminhos ao exibir operações. Em ambientes sensíveis, avalie o risco de expor metadados.
- Evite executar git clone/install de fontes não confiáveis. Use repositórios oficiais ou pacotes mantidos pela sua distro quando possível.
Glossário (1 linha cada)
- pv: utilitário que visualiza dados que passam por um pipe (pipe viewer).
- progress: monitor que detecta progressos de utilitários do sistema sem alterar o comando.
- ETA: tempo estimado restante (Estimated Time of Arrival).
- rsync: ferramenta para sincronização/transferência eficiente de arquivos.
Resumo final
pv e progress resolvem a mesma dor — saber quanto falta em operações longas —, mas de modos distintos: pv exige inserir-se no pipeline; progress observa processos em execução. Escolha pv quando puder alterar o comando e precisar de controle fino (limitar taxa, passar -s); escolha progress quando o processo já estiver rodando ou quando não quiser reiniciá‑lo. Para sincronizações remotas e reinício confiável, prefira rsync.
Principais ações recomendadas:
- Instale pv para pipelines interativos e scripts.
- Instale progress para monitoramento em servidores sem reiniciar processos.
- Use rsync quando precisar de robustez, reinício e verificação de integridade.
Extras:
- TL;DR: pv para pipes, progress para processos ativos. rsync para sincronização confiável.
Notas finais: mantenha permissões corretas ao rodar comandos como sudo e revise os caminhos usados nos exemplos antes de executar.