Estoy ejecutando un script de shell que canaliza datos de un proceso a otro
process_a | process_b
¿Alguien sabe una manera de averiguar cuántos bytes se pasaron entre los dos programas? La única solución que puedo pensar en este momento sería escribir un pequeño programa c que lea de stdin, escriba en stdout y cuente todos los datos transferidos, almacenando el conteo en una variable de entorno, como:
process_a | count_bytes | process_b
¿Alguien tiene una solución más ordenada?
exec
y simplemente enviarlo directamente al archivo?input-command | dd 2>~/fred | output-command
Utilice pv el visor de tuberías. Es una gran herramienta. Una vez que lo sepas, nunca sabrás cómo viviste sin él.
También puede mostrarle una barra de progreso y la 'velocidad' de la transferencia.
fuente
cat file | pv -b
devolverá el tamaño del archivo.process_a | tee >(process_b) | wc --bytes
Podría funcionar. Luego puede redirigirwc
el recuento a donde lo necesite. Siprocess_b
genera algo astdout
/stderr
probablemente necesitará redirigir esto a alguna parte, aunque solo sea/dev/null
.Para un ejemplo ligeramente artificial:
A modo de explicación: le
tee
permite dirigir la salida a múltiples archivos (más stdout) y la>()
construcción es la "sustitución de procesos" de bash, lo que hace que un proceso se vea como un archivo de solo escritura en este caso para que pueda redirigir a procesos y archivos ( vea aquí , o esta pregunta + respuesta para ver un ejemplo del usotee
para enviar resultados a muchos procesos).fuente
Sé que llego tarde a la fiesta, pero creo que tengo una buena respuesta que puede mejorar este útil hilo.
Esta es una mezcla de @Phil P y @David Spillett, pero:
El conteo de bytes se imprime en stdout, junto con cualquier salida de process_b.
Puede usar un prefijo para identificar la línea que contiene bytes al trabajar con la salida (
Bytes:
en el ejemplo).ADVERTENCIA:
No confíe en el orden de las líneas en la salida. ¡
El orden es impredecible y siempre puede diferir, incluso cuando se llama al mismo script con los mismos parámetros!
fuente