pv: Monitorando o Progresso do Pipe com Barra de Progresso

pv: Monitorando o Progresso do Pipe com Barra de Progresso

O Que é o pv?

Conclusão: pv (Pipe Viewer) mede os dados fluindo por um pipe e mostra uma barra de progresso ao vivo, tempo decorrido, taxa de transferência e ETA. Ele cura a ansiedade de "será que isso ainda está funcionando?" do dd e cp.

Quando você envia dados para dd, gzip, tar ou mysql, o comando frequentemente fica silencioso até 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 até agora
  • 0:00:42: tempo decorrido
  • [29.0MiB/s]: taxa de transferência atual
  • [====>]: barra de progresso
  • 48%: porcentagem concluída
  • ETA 0:00:45: tempo estimado para finalizar

O que você vai aprender

  • O padrão básico para colocar uma barra de progresso em um pipe
  • Como obter um ETA mesmo quando o tamanho do pipe é desconhecido (-s)
  • Truques práticos: limitação de taxa, contagem de linhas e monitoramento de processo em execução

Como Instalar o pv?

Conclusão: pv geralmente não vem instalado por padrão. Use apt no Debian/Ubuntu, dnf em sistemas da família 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 instalação:

$ pv --version
pv 1.6.20

Muitos servidores mínimos não vêm com pv. Se você encontrar command not found, instale conforme mostrado acima. Quando não puder adicionar pacotes em uma máquina de produção, a flag -d (monitorar um processo em execução, coberta abaixo) é frequentemente uma alternativa viavel.

Qual é o Uso Básico?

Conclusão: Passe um arquivo como argumento e pv detecta o tamanho automaticamente, dando porcentagem e ETA. Caso contrário, insira pv no meio de um pipe existente.

Passar um arquivo (tamanho auto-detectado)

Dado um nome de arquivo, pv lê o tamanho via stat, então 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 já existe, insira pv onde quiser medir.

$ gzip -dc backup.sql.gz | pv | mysql mydb

Aqui pv lê da entrada padrão e não consegue saber o tamanho total, então porcentagem e ETA são omitidos (apenas a contagem de bytes, tempo decorrido e taxa são mostrados). Para obter um ETA, use -s a seguir.

Como Obter um ETA Quando o Tamanho é Desconhecido?

Conclusão: Ao ler de stdin com tamanho desconhecido, declare o tamanho esperado com -s. Combine com du ou o tamanho pré-compressão 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 são aceitos.

$ pv -s 2g backup.sql.gz | gunzip | mysql mydb

Ao arquivar um diretório com tar, o idioma comum é calcular o tamanho real com du e passá-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 compressão reduz a saída, então trate o ETA como uma estimativa ao passar por gzip.

Como Personalizar a Exibição?

Conclusão: Escolha os campos com flags: -p barra, -t timer, -e ETA, -r taxa, -b contagem de bytes, -N nome. Sem flags, você recebe tudo.

Especificar mesmo uma opção restringe a saída apenas aos campos solicitados.

Flag Mostra
-p barra de progresso
-t tempo decorrido
-e ETA (tempo restante)
-r taxa de transferência atual
-a taxa de transferência média
-b bytes transferidos
-N um rótulo de nome

Quando você alinha várias instâncias de pv, rótulos -N facilitam a distinção.

$ pv -N "read" -cb source.dat | gzip | pv -N "compressed" -cb > out.gz

-n (--numeric) imprime a porcentagem como um número 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 Transferência?

Conclusão: -L (--rate-limit) limita o throughput. É útil para copias onde você quer evitar saturar um disco ou rede de produção.

$ pv -L 10m bigfile.iso > /mnt/backup/bigfile.iso

Isso limita a transferência a 10 MiB por segundo. Use quando um backup não deve monopolizar I/O de disco ou largura de banda e prejudicar serviços em operação.

O valor de -L é em bytes por segundo. 10m significa 10 MiB/s, não 10 Mbps (megabits por segundo). É fácil confundir com unidades de largura de banda de rede.

Como Rastrear Progresso por Contagem de Linhas?

Conclusão: -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. Prático para jobs batch ou importações onde a contagem de linhas é conhecida antecipadamente.

Como Monitorar Múltiplos Estágios de um Pipe?

Conclusão: Para colocar pv em vários pontos de um pipe, adicione -c (--cursor). Sem isso, as exibições 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 rótulos -N para deixar claro a qual estágio cada barra pertence.

Como Ver o Progresso de um Processo em Execução?

Conclusão: Conecte-se a um cp ou dd já em execução com pv -d PID. É o movimento de resgate para quando você esqueceu de inserir pv desde o início.

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 único descritor de arquivo, use a forma PID:FD.

$ pv -d 4821:1

pv -d lê o /proc/<PID>/fd e /proc/<PID>/fdinfo do alvo para estimar o progresso. Funciona apenas no Linux e é o recurso de recuperação padrão para um cp, dd ou gzip longo que você esqueceu de envolver.

Problemas Comuns e Soluções

Conclusão: A maioria dos casos de porcentagem ou ETA ausente se deve a tamanho desconhecido. Forneça com -s, ou passe o arquivo como argumento diretamente.

Sem porcentagem ou ETA

pv está lendo de stdin e não consegue determinar o tamanho. Passe o arquivo diretamente como pv file, ou forneça um tamanho esperado com -s.

command not found: pv

Não instalado. Veja as etapas de instalação. Se não puder adicioná-lo a produção, considere monitoramento externo com pv -d PID.

A barra pula direto para 100%

Os dados são pequenos, ou o valor de -s é menor que os dados reais. Verifique se o tamanho em -s está correto.

bash: /usr/bin/pv: Argument list too long

Este é o limite de expansão do shell, não do pv em si. Em vez de expandir muitos arquivos para pv, passe um fluxo de linhas como find ... | pv -l | xargs.

Resumo: Próximas Leituras

Insira pv em um único ponto de um pipe e um job anteriormente silencioso começa a dizer quantos segundos faltam. Gravar imagens com dd, fazer backup com tar/gzip, importar para mysql -- a sensação de todo job de longa duração muda. Comece substituindo cat por pv.