pv: Monitorando o Progresso do Pipe com Barra de Progresso

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?" do dd e cp.

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 agora
  • 0:00:42: tempo decorrido
  • [29.0MiB/s]: taxa de transferencia atual
  • [====>]: barra de progresso
  • 48%: porcentagem concluida
  • ETA 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: pv geralmente nao vem instalado por padrao. Use apt no Debian/Ubuntu, dnf em sistemas da familia RHEL e brew no 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 pv detecta o tamanho automaticamente, dando porcentagem e ETA. Caso contrario, insira pv no 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 com du ou 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: -p barra, -t timer, -e ETA, -r taxa, -b contagem de bytes, -N nome. 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 pv em 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 cp ou dd ja em execucao com pv -d PID. E o movimento de resgate para quando voce esqueceu de inserir pv desde 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.

Resumo: Proximas Leituras

Insira pv em um unico ponto de um pipe e um job anteriormente silencioso comeca a dizer quantos segundos faltam. Gravar imagens com dd, fazer backup com tar/gzip, importar para mysql -- a sensacao de todo job de longa duracao muda. Comece substituindo cat por pv.