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?" doddecp.
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é agora0:00:42: tempo decorrido[29.0MiB/s]: taxa de transferência atual[====>]: barra de progresso48%: porcentagem concluídaETA 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:
pvgeralmente não vem instalado por padrão. Useaptno Debian/Ubuntu,dnfem sistemas da família RHEL ebrewno 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
pvdetecta o tamanho automaticamente, dando porcentagem e ETA. Caso contrário, insirapvno 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 comduou 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:
-pbarra,-ttimer,-eETA,-rtaxa,-bcontagem de bytes,-Nnome. 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
pvem 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
cpouddjá em execução compv -d PID. É o movimento de resgate para quando você esqueceu de inserirpvdesde 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.