Beenden Sie eine Pipeline, wenn n Sekunden lang keine Daten fließen

Beenden Sie eine Pipeline, wenn n Sekunden lang keine Daten fließen

Ich habe eine Software, die eine Zeit lang Daten auf stdout produziert, dann weiterläuft, aber keine Daten mehr ausgibt.

Ich habe eine Pipeline, die diese Ausgabe entgegennimmt, weiterverarbeitet und die Ausgabe in einer Datei speichert. Da der ursprüngliche Prozess jedoch weiterläuft, nachdem er die Ausgabe erzeugt hat, muss ich ihn manuell beenden. Gibt es einen Befehl, der das laufende Programm beendet, wenn es einige Sekunden lang keine Ausgabe erzeugt hat?

Ich kenne den Timeout-Befehl, aber der sieht so aus, als würde er mit einem festen Timeout arbeiten. Ich habe keine zuverlässige Methode, um zu bestimmen, wie lange die Software noch Ausgaben macht.

Beispiel:

Angenommen, ich habe Folgendes generate-data, das so aussieht und nicht geändert werden kann. In Wirklichkeit handelt es sich dabei um ein kompiliertes Softwareteil, das ich lieber nicht ändern möchte.

#! /usr/bin/env bash

for x in {1..5}; do
    echo $x
    sleep 1
done

while true; do sleep 1; done

Ich führe derzeit etwas wie aus ./generate_data | grep '[2-4]' > output, das die gewünschte Ausgabe erzeugt, aber nie beendet wird.

Ich möchte die Pipeline beenden, wenn generate_datasie 2 Sekunden lang nichts ausgibt.

Antwort1

Verwenden Sie den Lesebefehl. Der Schalter -t ist Ihr Freund. Ähnlich wie dieser

(echo "we:re:e";sleep 2;echo "d:dd:d") | while read -d ":" -t 2 a;do echo $a;done

Die Ausgabe:

 we
 re
(echo "we:re:e";sleep 1;echo "d:dd:d") | while read -d ":" -t 2 a;do echo $a;done

Die Ausgabe:

we
re
e d
dd

verwandte Informationen