Sie könnten versuchen mbuffer
(weiß nicht, ob es standardmäßig in Debian ist):
cat example.txt | mbuffer -R 100 > /dev/ttyUSB0
Ich wanderte, wenn es ein Linux-Programm gibt, das den Datendurchsatz eines Pipe-In tatsächlich einschränken kann Bytes pro Sekunde .
Von dem, was ich erfahre, wäre dies für die Zwecke geeignet
bfr
wurde jedoch aus Debian entfernt ( Kandidat für die Entfernung: bfr )cpipe
Es scheint jedoch, dass die niedrigste Auflösung, die es unterstützt, kB / s ist, was bedeutet, dass Buffer- Write-Vorgänge immer noch MB / s erreichen können ( [Gelöst] Gibt es ein Programm, um die Pipe-Geschwindigkeit der Terminals zu begrenzen? - Seite 2 - Ubuntu-Foren )Was ich möchte, ist, so etwas spezifizieren zu können
cat example.txt | ratelimit -Bps 100 > /dev/ttyUSB0
... und tatsächlich haben Sie ein einzelnes Byte aus example.txt, das jeweils 1/100 = 0,01 s (oder 10 ms) an 'output' gesendet wird.
Sie könnten versuchen mbuffer
(weiß nicht, ob es standardmäßig in Debian ist):
cat example.txt | mbuffer -R 100 > /dev/ttyUSB0
pv
kann es auch tun. Hier einige mäßig erfundene Beispiele:
pv --rate-limit 1 /dev/zero > /dev/null
pv --quiet --rate-limit 16 /dev/urandom | hd
pv --quiet --rate-limit 10485760 /dev/zero | gzip | hd
head -c 1000 < /dev/zero | pv --size 1000 --rate-limit 150 | sha1sum
Nun, ich habe mich für einen Patch entschieden, den Patch cpipe
finden Sie hier: cpipe-3.0.1-singlebyte.patch ; es ist in Bezug auf das aktuelle ' apt-get source cpipe
' in Lucid (was mir cpipe_3.0.1.orig.tar.gz und cpipe_3.0.1-1.diff.gz bringt); Wenn die Quelle das Verzeichnis herunterlädt und entpackt cpipe-3.0.1
, machen Sie einfach Folgendes :
$ cp -a cpipe-3.0.1 cpipe-3.0.1B $ cd cpipe-3.0.1B $ patch -p1 < /path/to/cpipe-3.0.1-singlebyte.patch $ make
Befehlszeilenschalter -bs für 'Byte single' hinzugefügt, der jetzt das Schreiben von Einzelbytes auf 1 Bps unterstützt; so kann jetzt tun:
$ echo "hello" | ./cpipe -vt -vw -bs 1 | cat ./cpipe: period 1 sec, 1000.000000 ms, 1000000000 ns, 0.000000 nsrem h out: 1000.122ms at 0B/s ( 6B/s avg) 6B e out: 2000.343ms at 0B/s ( 2B/s avg) 6B l out: 3000.536ms at 1B/s ( 1B/s avg) 6B l out: 4000.730ms at 1B/s ( 1B/s avg) 6B o out: 5000.925ms at 1B/s ( 0B/s avg) 6B out: 6001.100ms at 1B/s ( 0B/s avg) 6B out: 6001.155ms at 1B/s ( 0B/s avg) 6B thru: 6001.209ms at 1B/s ( 1B/s avg) 6B $ echo "hello" | ./cpipe -vt -vw -bs 5 > /dev/null ./cpipe: period 0 sec, 200.000000 ms, 200000000 ns, 200000000.000000 nsrem out: 200.120ms at 0B/s ( 30B/s avg) 6B out: 400.323ms at 2B/s ( 10B/s avg) 6B out: 600.507ms at 3B/s ( 5B/s avg) 6B out: 800.690ms at 4B/s ( 3B/s avg) 6B out: 1000.870ms at 4B/s ( 2B/s avg) 6B out: 1201.049ms at 4B/s ( 1B/s avg) 6B out: 1201.098ms at 5B/s ( 1B/s avg) 6B thru: 1201.142ms at 5B/s ( 5B/s avg) 6B
... dies funktioniert jedoch bei höheren kB / s-Raten nicht allzu gut - in diesem Fall ist es besser, die übliche cpipe
-s
gepufferte Technik zu verwenden ...
$ cat /etc/X11/rgb.txt | ./cpipe -vt -vw -bs 102400 > /dev/null .... out: 2675.206ms at 6.3kB/s ( 1B/s avg) 17.0kB out: 2675.240ms at 6.3kB/s ( 1B/s avg) 17.0kB thru: 2675.832ms at 6.3kB/s ( 6.3kB/s avg) 17.0kB $ cat /etc/X11/rgb.txt | ./cpipe -vt -vw -s 100 > /dev/null out: 0.011ms at 1.5GB/s ( 1.5GB/s avg) 17.0kB thru: 166.630ms at 101.9kB/s ( 101.9kB/s avg) 17.0kB
... wie es auch heißt in man cpipe
:
Da auf den meisten Systemen eine bestimmte Mindestzeit für das Einschlafen von usleep (), z. B. 0,01 s, vorhanden ist, können mit einer kleinen Puffergröße keine hohen Grenzwerte erreicht werden
Nun, ich hoffe zu hören, dass es einen besseren Weg gibt, dies zu kontrollieren,
Cheers!
Hier ist auch ein Perl-only-Skript, cratelimit.pl - möglicherweise nicht sehr genau, scheint jedoch den Trick etwas auszuführen ( -r
Argument akzeptiert Bytes pro Sekunde):
cat whatever | ./cratelimit.pl -r=50000