¿Cómo duplicar una transmisión y procesar ambas partes en forma de transmisión?

¿Cómo duplicar una transmisión y procesar ambas partes en forma de transmisión?

A veces quiero insertar algo en una canalización para generar informes o algún otro uso secundario. Podría ser tan simple como wc -l, o algo más complejo como una bestia awko incluso un script en Python. Sería bueno ejecutar una canalización como esta:

zcat my_data_file.gz \
| wc -l > /tmp/linecount
| process_data.py

El problema es que la mayoría de las utilidades no corrigen los datos a la salida estándar. teePuedo escribir los datos en un archivo temporal, pero luego tengo que esperar hasta que todo esté hecho:

zcat my_data_file.gz \
| tee /tmp/f \
| process_data.py && \
wc -l /tmp/f > /tmp/linecount && rm /tmp/f

Esto no es óptimo: puede ser un proceso de muy largo plazo; Es posible que desee ver resultados intermedios del análogo wcantes; y es posible que no desee almacenar todos los datos en un archivo temporal.

Respuesta1

Puede utilizar teey procesar la sustitución >(...)para esto:

zcat my_data_file.gz |

# Count number of lines in stream
tee >(wc -l > /tmp/linecount) |

# Further processing
process_data.py

Tenga en cuenta que las canalizaciones se pueden utilizar para la continuación de líneas y que los comentarios se pueden intercalar entre los comandos, una característica interesante al crear canalizaciones complicadas.

Respuesta2

No es del todo eficiente, pero puedes lograrlo contuberías con nombre, que puedes crear conmkififo(1)

Para el ejemplo de la pregunta:

mkfifo /tmp/f

wc -l /tmp/f > /tmp/linecount &

zcat my_data_file.gz \
| tee /tmp/f \
| process_data.py &

wait

rm /tmp/f

Tenga en cuenta lo &adjunto a ambos wcy a la tubería; esto significa que el shell enviará las tareas a un segundo plano. La llamada a waitluego espera a que concluyan todas las tareas en segundo plano. Ambos procesos finalizarán aproximadamente al mismo tiempo.

Tenga en cuenta que si uno de sus procesos es sustancialmente más lento, podría ralentizar todo significativamente, ya que teepuede bloquearse en su canal de salida estándar o en el canal con nombre en el que está escribiendo.Editar: Además, ahora tiene más modos de falla, ya que la T saldrá debido a una tubería rota si falla el proceso secundario.

información relacionada