
Tengo un software que produce datos en la salida estándar por un tiempo, luego continúa ejecutándose pero no genera más datos.
Tengo una canalización que toma ese resultado y lo procesa más, guardándolo en un archivo. Sin embargo, debido a que el proceso original continúa ejecutándose después de que termina de producir resultados, tengo que finalizarlo manualmente. ¿Existe algún comando que finalice el programa en ejecución una vez que no haya producido ningún resultado durante algunos segundos?
Conozco el comando de tiempo de espera, pero parece que funciona con un tiempo de espera fijo. No tengo una forma confiable de determinar cuánto tiempo seguirá funcionando el software.
Ejemplo:
Supongamos que tengo generate-data
un aspecto similar a este y no se puede modificar. En realidad, se trata de un software compilado que preferiría no modificar.
#! /usr/bin/env bash
for x in {1..5}; do
echo $x
sleep 1
done
while true; do sleep 1; done
Actualmente ejecuto algo como ./generate_data | grep '[2-4]' > output
, que produce el resultado que quiero pero nunca termina.
Me gustaría finalizar la canalización una vez que generate_data
no genere nada durante 2 segundos.
Respuesta1
Utilice el comando de lectura. El modificador -t es tu amigo. Similar a esto
(echo "we:re:e";sleep 2;echo "d:dd:d") | while read -d ":" -t 2 a;do echo $a;done
La salida:
we
re
(echo "we:re:e";sleep 1;echo "d:dd:d") | while read -d ":" -t 2 a;do echo $a;done
La salida:
we
re
e d
dd