Estou executando um script de shell que canaliza dados de um processo para outro
process_a | process_b
Alguém sabe uma maneira de descobrir quantos bytes foram passados entre os dois programas? A única solução que posso pensar no momento seria escrever um pequeno programa c que lê de stdin, grava em stdout e conta todos os dados transferidos, armazenando a contagem em uma variável de ambiente, como:
process_a | count_bytes | process_b
Alguém tem uma solução mais limpa?
exec
o arquivo e apenas enviá-lo diretamente?input-command | dd 2>~/fred | output-command
Use pv o espectador tubo. É uma ótima ferramenta. Depois que você souber, nunca saberá como viveu sem ele.
Também pode mostrar uma barra de progresso e a 'velocidade' da transferência.
fonte
cat file | pv -b
retornará o tamanho do arquivo.process_a | tee >(process_b) | wc --bytes
pode funcionar. Você pode redirecionarwc
a contagem para onde for necessário. Se produzirprocess_b
algo parastdout
/stderr
você provavelmente precisará redirecioná-lo para algum lugar, se for o caso/dev/null
.Para um exemplo um pouco artificial:
Como explicação:
tee
permite direcionar a saída para vários arquivos (mais o stdout) e a>()
construção é a "substituição de processo" do bash, que faz com que um processo pareça um arquivo somente de gravação nesse caso, para que você possa redirecionar para processos e arquivos ( veja aqui , ou esta pergunta + resposta para um exemplo de como usartee
para enviar saída para muitos processos).fonte
Sei que estou atrasado para a festa, mas acredito que tenho uma boa resposta que pode melhorar esse tópico útil.
Esta é uma mistura das respostas @Phil P e @David Spillett, mas:
A contagem de bytes é impressa em stdout, juntamente com qualquer saída de process_b.
Você pode usar um prefixo para identificar a linha que contém bytes ao trabalhar com a saída (
Bytes:
no exemplo).AVISO:
Não confie na ordem das linhas na saída
A ordem é imprevisível e sempre pode ser diferente, mesmo ao chamar o mesmo script com os mesmos parâmetros!
fonte