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: Ссылка
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):
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:
Hinweis: Vergessen Sie nicht das Semikolon nach Ihrem Befehl (hier das grep brown
), wie es nötig ist!
So etwas?
%Vor%Speichere die Datei als "slowboy", dann mach
%Vor%und als
ausführen %Vor% 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:
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!
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.