
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_data
sie 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