Wie kann man eine Pipe unter Linux bewerten?


63

Gibt es einen Filter, den ich verwenden könnte, um eine Pipe unter Linux einzuschränken? Wenn dies existiert, nennen wir es rate-limit, ich möchte in der Lage sein, ein Terminal so etwas wie einzugeben

cat /dev/urandom | rate-limit 3 -k | foo

um einen Strom von zufälligen Bytes mit einer Geschwindigkeit (unter 3 kByte / s) an die Standardeingabe von foo zu senden.


1
Ich habe hier gefragt, weil ich es in einem Programm verwenden möchte, nicht zur Fehlerbehebung. Aber es ist meine allererste Frage hier, also entschuldige ich mich, wenn ich einen Fehler gemacht habe.

1
Übrigens, obiges ist eine unnötige Verwendung von Katze, die Sie tun könnten rate-limit 3k < /dev/urandom | foo.
dmckee

Antworten:


91

Pipe Viewer hat diese Funktion.

cat /dev/urandom | pv -L 3k | foo

1
Auch praktisch, wenn Sie die Ausgabe eines Jobs -qcommand 2>&1 | pv -q -L 3k
ansehen

17

Ich würde sagen, dass Juliano die richtige Antwort hat, wenn Sie dieses Tool haben, aber ich würde auch vorschlagen, dass dies eine nette kleine Übung im K & R-Stil ist: Schreiben Sie einfach eine spezialisierte Version von cat, die jeweils ein Zeichen liest stdinund ausgibt jeweils zu stdoutund dann usleeps, bevor Sie weitermachen. Achten Sie darauf , die Standardausgabe zu entpuffern , da dies sonst zu ruckartigen Ergebnissen führt.

Ich nannte das slowcat.c:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char**argv){
  int c;
  useconds_t stime=10000; // defaults to 100 Hz

  if (argc>1) { // Argument is interperted as Hz
    stime=1000000/atoi(argv[1]);
  }

  setvbuf(stdout,NULL,_IONBF,0);

  while ((c=fgetc(stdin)) != EOF){
    fputc(c,stdout);
    usleep(stime);
  }

  return 0;
}

Kompiliere es und versuche es mit

$ ./slowcat 10 < slowcat.c

18
Jetzt verspüre ich die schreckliche Versuchung, jedem Charakter ein "Klack" -Geräusch hinzuzufügen und die Standardgeschwindigkeit auf 40 CPS zu setzen, mit einer zusätzlichen Verzögerung für Zeilenumbrüche.
dmckee

Ich würde das mit einem dieser Retro-Terminal-Bildschirmschoner für ein Kichern verwenden, wenn ich Lautsprecher an meine Linux-Boxen angeschlossen hätte.
Benny Mackney

4

Gaspedal scheint speziell dafür ausgelegt. z.B

cat /dev/urandom | throttle -k 3 | foo

1
Ich würde dem zustimmen, aber es scheint kein Standardpaket für Ubuntu zu geben. Ich sehe auch nicht den Quellcode dafür. Weiß jemand, wo Sie dieses Dienstprogramm bekommen können?
Benjamin Leinweber

1
@BenjaminLeinweber Es sieht so aus, als wäre die Website, auf der der Code normalerweise gehostet wird, offline, aber freebsd hat den Quellcode für 1.2 auf seinem FTP-Server verfügbar . Sie müssten es dort herunterladen & ./configure && make.
Ponkadoodle

3

Hier ist eine All-Shell-Lösung, bei der keine Eingaben verloren gehen (vgl. Die Idee head -1 von Mike S):

hexdump -c /dev/urandom | (lines=0; while read line; do echo $line; if [ $((++lines % 10)) -eq 0 ]; then sleep 1; fi; done) | cat -n

2

Schnell und dreckig, die ganze Zeit Shell (ich habe CentOS und pv wird standardmäßig nicht mitgeliefert):

hexdump -c /dev/urandom | while true; do head -1; sleep 1; done | \
your_program_that_reads_stdin  -your_argument_list

... dreckig, denn obwohl die Rate begrenzt ist, ist es mit einer Rate platzen, die ich dir nicht sagen kann :-). Aber es ist praktisch, wenn Sie nur Daten von einem Ort zum anderen senden müssen (ich habe einige Socat-Tests durchgeführt) und Ihren Bildschirm nicht mit Müll überschwemmen möchten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.