Linux altında bir borunun hızı nasıl sınırlanır?


63

Linux'ta bir boruyu sınırlandırmak için kullanabileceğim bir filtre var mı? Eğer bu varsa, haydi limitini çağıralım, bunun gibi bir terminal yazabilmek istiyorum.

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

foo'nun standart girişine 3 kbayt / sn'den daha düşük bir rasgele bayt akımı göndermek için.


1
Burada sordum çünkü bir programda kullanmak istiyorum, sorun giderme için değil. Ama buradaki ilk sorum, bu yüzden bir hata yaptıysam özür dilerim.

1
Btw, yukarıdaki gereksiz bir kedi kullanımı, yapabileceğiniz rate-limit 3k < /dev/urandom | foo.
dmckee

Yanıtlar:


91

Boru Görüntüleyici bu özelliğe sahiptir.

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

1
Ayrıca, bir iş çıktısını izlerken de kullanmak için kullanışlıdır -q... örneğin:command 2>&1 | pv -q -L 3k
Attie

17

Ben derim Juliano doğru cevabı var o aracı varsa, ama bir de bu düzgün bir küçük K & R tarzı egzersiz olduğunu öneririm: Sadece bir seferde bir karakter okur kedinin özel bir versiyonunu yazmak stdinçıkışları, Her biri için stdoutve sonra devam usleepetmeden önce s. Standart çıktının çözülmediğinden emin olun , aksi takdirde bu titizlikle çalışır.

Bunu aradım 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;
}

Derleyin ve deneyin

$ ./slowcat 10 < slowcat.c

18
Şimdi, her karaktere "clack" bir gürültü eklemek ve yeni hatları için ekstra bir gecikme ile varsayılan hızı 40 CPS'ye ayarlamak için korkunç bir cazibe duygusu hissediyorum.
dmckee

Eğer linux kutularıma hoparlör takmış olsaydım, kıkırdamak için bu retro terminal ekran koruyucularından biriyle kullanırdım.
Benny Mackney,

4

gaz , bunun için özel olarak tasarlanmış görünüyor . Örneğin

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

1
Buna katılıyorum ama Ubuntu için standart bir paket gibi görünmüyor. Ayrıca bunun için kaynak kodunu göremiyorum. Bu yardımcı programı nereden bulabileceğinizi bilen var mı?
Benjamin Leinweber

1
@BenjaminLeinweber Normalde kodu barındıran web sitesine benziyor , ancak freebsd ftp sunucusunda mevcut 1.2 kaynağına sahip . Orada indirmek zorunda kalacaktı ./configure && make.
Ponkadoodle

3

İşte girişini kaybetmeyecek bir kabuk çözümü (Mike S'den baş -1 fikri):

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

Çabuk ve kirli, her zaman her zaman kabuk (CentOS'um var ve pv varsayılan olarak gelmiyor):

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

... kirli çünkü oranı sınırlı olmasına rağmen, size söyleyemediğim bir oranda kırılıyor :-). Ancak, yalnızca bir yerden diğerine veri göndermeniz gerektiğinde (bazı socat testleri yapıyordum) ve ekranınızı çöp ile değiştirmek istemiyorsanız kullanışlıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.