Gibt es einen Shell-Befehl, um einen Puffer zu verzögern?

9

Ich bin auf der Suche nach einem Shell-Befehl X wie, wenn ich folgendes ausführen:

%Vor%

Der stdout von command_a wird (mindestens) 5 Sekunden später in stdin von command_b geschrieben.

Eine Art Verzögerungspuffer.

Soweit ich weiß, kann buffer / mbuffer mit konstanter Rate schreiben (eine feste Anzahl von Bytes pro Sekunde). Stattdessen möchte ich eine konstante Verzögerung in der Zeit (t = 0 ist, wenn X einen command_a output chunk liest, bei t = 5000 muss dieser chunk in command_b geschrieben werden).

[Bearbeiten] Ich habe es implementiert: Ссылка

    
rom1v 07.01.2014, 19:04
quelle

5 Antworten

1

Da ein solcher Befehl nicht existiert, habe ich ihn in C implementiert: Ссылка

%Vor%     
rom1v 12.01.2014, 17:53
quelle
8

Ich weiß, dass du gesagt hast, dass du nach einem Shell-Befehl suchst, aber was ist mit der Verwendung einer Subshell zu deinem Vorteil? Etwas wie:

%Vor%

Also zu grep eine Datei cat -ed durch (Ich weiß, ich weiß, schlechte Verwendung von cat , aber nur ein Beispiel):

%Vor%

Ein vollständigeres Beispiel:

%Vor%

Oder sogar, wie Michale Krotat empfiehlt, würde auch ein Gruppenbefehl mit sleep funktionieren (und ist wohl korrekter). Wie so:

%Vor%

Hinweis: Vergessen Sie nicht das Semikolon nach Ihrem Befehl (hier das grep brown ), wie es nötig ist!

    
Dan Fego 07.01.2014 19:15
quelle
1

So etwas?

%Vor%

Speichere die Datei als "slowboy", dann mach

%Vor%

und als

ausführen %Vor%     
Mark Setchell 07.01.2014 19:13
quelle
1

Ihre Frage hat mich fasziniert, und ich habe mich entschieden, zurückzukommen und damit zu spielen. Hier ist eine grundlegende Implementierung in Perl. Es ist wahrscheinlich nicht portierbar ( ioctl ), getestet nur unter Linux.

Die Grundidee ist:

  • liest die verfügbare Eingabe alle X Mikrosekunden
  • speichert jeden Eingabe-Chunk in einem Hash mit dem aktuellen Zeitstempel als Schlüssel
  • drückt auch den aktuellen Zeitstempel in einer Warteschlange (Array)
  • sucht nach den ältesten Zeitstempeln in der Warteschlange und schreibt Daten aus dem Hash, wenn sie lange genug verzögert sind
  • wiederhole

Maximale Puffergröße

Es gibt eine maximale Größe für gespeicherte Daten. Wenn diese Daten erreicht sind, werden keine weiteren Daten gelesen, bis nach dem Schreiben Speicherplatz frei wird.

Leistung

Es ist wahrscheinlich nicht schnell genug für Ihre Anforderungen (mehrere MB / s). Mein maximaler Durchsatz betrug 639 Kb / s, siehe unten.

Testen

%Vor%

buffer_delay.pl

%Vor%

Fühlen Sie sich frei, Kommentare und Vorschläge unten zu posten!

    
grebneke 12.01.2014 12:56
quelle
0

Dies könnte funktionieren

%Vor%

Die erste Schleife kennzeichnet jede Zeile ihrer Eingabe mit einem Zeitstempel und führt sie sofort der zweiten Schleife zu. Die zweite Schleife überprüft den Zeitstempel jeder Zeile und wird ggf. bis $delay Sekunden nach dem ersten Lesen vor dem Ausgeben der Zeile inaktiviert.

    
chepner 07.01.2014 20:51
quelle

Tags und Links