pv: Monitorando o Progresso do Pipe com Barra de Progresso
O Que e o pv?
Conclusao:
pv(Pipe Viewer) mede os dados fluindo por um pipe e mostra uma barra de progresso ao vivo, tempo decorrido, taxa de transferencia e ETA. Ele cura a ansiedade de "sera que isso ainda esta funcionando?" doddecp.
Quando voce envia dados para dd, gzip, tar ou mysql, o comando frequentemente fica silencioso ate terminar, parecendo que travou. Coloque pv no pipe e ele revela quantos bytes foram processados e aproximadamente quanto tempo falta.
$ pv bigfile.iso | dd of=/dev/sdb 1.2GiB 0:00:42 [29.0MiB/s] [=========> ] 48% ETA 0:00:45
Os seis campos significam:
1.2GiB: bytes transferidos ate agora0:00:42: tempo decorrido[29.0MiB/s]: taxa de transferencia atual[====>]: barra de progresso48%: porcentagem concluidaETA 0:00:45: tempo estimado para finalizar
O que voce vai aprender
- O padrao basico para colocar uma barra de progresso em um pipe
- Como obter um ETA mesmo quando o tamanho do pipe e desconhecido (
-s) - Truques praticos: limitacao de taxa, contagem de linhas e monitoramento de processo em execucao
Como Instalar o pv?
Conclusao:
pvgeralmente nao vem instalado por padrao. Useaptno Debian/Ubuntu,dnfem sistemas da familia RHEL ebrewno macOS.
# Debian / Ubuntu $ sudo apt install pv # RHEL / Rocky / AlmaLinux / Fedora $ sudo dnf install pv # macOS (Homebrew) $ brew install pv
Verifique a instalacao:
$ pv --version pv 1.6.20
Muitos servidores minimos nao vem com pv. Se voce encontrar command not found, instale conforme mostrado acima. Quando nao puder adicionar pacotes em uma maquina de producao, a flag -d (monitorar um processo em execucao, coberta abaixo) e frequentemente uma alternativa viavel.
Qual e o Uso Basico?
Conclusao: Passe um arquivo como argumento e
pvdetecta o tamanho automaticamente, dando porcentagem e ETA. Caso contrario, insirapvno meio de um pipe existente.
Passar um arquivo (tamanho auto-detectado)
Dado um nome de arquivo, pv le o tamanho via stat, entao pode mostrar porcentagem e ETA.
$ pv access.log | grep "404" > errors.txt
Pense nisso como usar pv no lugar de cat.
Inserir em um pipe existente
Se um pipe ja existe, insira pv onde quiser medir.
$ gzip -dc backup.sql.gz | pv | mysql mydb
Aqui pv le da entrada padrao e nao consegue saber o tamanho total, entao porcentagem e ETA sao omitidos (apenas a contagem de bytes, tempo decorrido e taxa sao mostrados). Para obter um ETA, use -s a seguir.
Como Obter um ETA Quando o Tamanho e Desconhecido?
Conclusao: Ao ler de stdin com tamanho desconhecido, declare o tamanho esperado com
-s. Combine comduou o tamanho pre-compressao para produzir um ETA.
-s (--size) recebe a contagem total de bytes, que pv trata como 100% para calcular porcentagem e ETA. Sufixos k/m/g sao aceitos.
$ pv -s 2g backup.sql.gz | gunzip | mysql mydb
Ao arquivar um diretorio com tar, o idioma comum e calcular o tamanho real com du e passa-lo.
$ tar -cf - mydir | pv -s "$(du -sb mydir | cut -f1)" > mydir.tar
du -sb retorna o tamanho total em bytes (-b = bytes). cut -f1 extrai apenas a coluna de tamanho para alimentar -s. A compressao reduz a saida, entao trate o ETA como uma estimativa ao passar por gzip.
Como Personalizar a Exibicao?
Conclusao: Escolha os campos com flags:
-pbarra,-ttimer,-eETA,-rtaxa,-bcontagem de bytes,-Nnome. Sem flags, voce recebe tudo.
Especificar mesmo uma opcao restringe a saida apenas aos campos solicitados.
| Flag | Mostra |
|---|---|
-p |
barra de progresso |
-t |
tempo decorrido |
-e |
ETA (tempo restante) |
-r |
taxa de transferencia atual |
-a |
taxa de transferencia media |
-b |
bytes transferidos |
-N |
um rotulo de nome |
Quando voce alinha varias instancias de pv, rotulos -N facilitam a distincao.
$ pv -N "read" -cb source.dat | gzip | pv -N "compressed" -cb > out.gz
-n (--numeric) imprime a porcentagem como um numero puro, ideal como entrada para um script shell ou dialog --gauge.
$ pv -n bigfile 2>&1 >/dev/null | while read p; do echo "progress $p%"; done
Como Limitar a Taxa de Transferencia?
Conclusao:
-L(--rate-limit) limita o throughput. E util para copias onde voce quer evitar saturar um disco ou rede de producao.
$ pv -L 10m bigfile.iso > /mnt/backup/bigfile.iso
Isso limita a transferencia a 10 MiB por segundo. Use quando um backup nao deve monopolizar I/O de disco ou largura de banda e prejudicar servicos em operacao.
O valor de -L e em bytes por segundo. 10m significa 10 MiB/s, nao 10 Mbps (megabits por segundo). E facil confundir com unidades de largura de banda de rede.
Como Rastrear Progresso por Contagem de Linhas?
Conclusao:
-l(--line-mode) conta linhas em vez de bytes, adequado para processamento de logs e progresso por contagem de registros.
$ pv -l -s 1000000 access.log | grep "POST" > posts.log
Passe a contagem total de linhas para -s para exibir "linha N de um milhao" como porcentagem. Pratico para jobs batch ou importacoes onde a contagem de linhas e conhecida antecipadamente.
Como Monitorar Multiplos Estagios de um Pipe?
Conclusao: Para colocar
pvem varios pontos de um pipe, adicione-c(--cursor). Sem isso, as exibicoes colidem e quebram.
$ pv -cN "in" raw.dat | gzip | pv -cN "out" > raw.gz
-c gerencia o cursor do terminal para que cada pv desenhe seu progresso em uma linha separada. Combine com rotulos -N para deixar claro a qual estagio cada barra pertence.
Como Ver o Progresso de um Processo em Execucao?
Conclusao: Conecte-se a um
cpouddja em execucao compv -d PID. E o movimento de resgate para quando voce esqueceu de inserirpvdesde o inicio.
Dado um PID, -d (--watchfd) mostra o progresso de leitura/escrita em todos os descritores de arquivo que o processo tem abertos.
# Encontrar o PID de um dd rodando em outro terminal $ pgrep -a dd 4821 dd if=/dev/sda of=backup.img bs=1M # Espiar seu progresso depois do fato $ pv -d 4821
Para monitorar um unico descritor de arquivo, use a forma PID:FD.
$ pv -d 4821:1
pv -d le o /proc/<PID>/fd e /proc/<PID>/fdinfo do alvo para estimar o progresso. Funciona apenas no Linux e e o recurso de recuperacao padrao para um cp, dd ou gzip longo que voce esqueceu de envolver.
Problemas Comuns e Solucoes
Conclusao: A maioria dos casos de porcentagem ou ETA ausente se deve a tamanho desconhecido. Forneca com
-s, ou passe o arquivo como argumento diretamente.
Sem porcentagem ou ETA
pv esta lendo de stdin e nao consegue determinar o tamanho. Passe o arquivo diretamente como pv file, ou forneca um tamanho esperado com -s.
command not found: pv
Nao instalado. Veja as etapas de instalacao. Se nao puder adiciona-lo a producao, considere monitoramento externo com pv -d PID.
A barra pula direto para 100%
Os dados sao pequenos, ou o valor de -s e menor que os dados reais. Verifique se o tamanho em -s esta correto.
bash: /usr/bin/pv: Argument list too long
Este e o limite de expansao do shell, nao do pv em si. Em vez de expandir muitos arquivos para pv, passe um fluxo de linhas como find ... | pv -l | xargs.