Jak ograniczyć prędkość rury w systemie Linux?

63

Czy istnieje filtr, którego mógłbym użyć do ograniczenia prędkości potoku na Linuksie? Jeśli to istnieje, nazwijmy to limitem prędkości, chcę móc wpisać w terminalu coś w rodzaju

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

w celu wysłania strumienia losowych bajtów do standardowego wejścia foo z szybkością (mniejszą niż) 3 kB / s.

Frédéric Grosshans
źródło
1
Zapytałem tutaj, ponieważ chcę go używać w programie, a nie do rozwiązywania problemów. Ale to moje pierwsze pytanie, więc przepraszam, jeśli popełniłem błąd.
1
BTW, powyższe jest niepotrzebnym użyciem kota, możesz to zrobić rate-limit 3k < /dev/urandom | foo.
dmckee,

Odpowiedzi:

91

Przeglądarka rur ma tę funkcję.

cat /dev/urandom | pv -L 3k | foo
Juliano
źródło
1
Przydatny również podczas oglądania wyników pracy, z -q... np .:command 2>&1 | pv -q -L 3k
Attie
17

Powiedziałbym, że Juliano ma prawidłową odpowiedź, jeśli masz to narzędzie, ale sugerowałbym również, że jest to schludne małe ćwiczenie w stylu K&R: po prostu napisz specjalną wersję kota, który odczytuje po jednym znaku z stdinwyjścia przed stdouti po każdym usleep. Pamiętaj, aby cofnąć buforowanie standardowego wyjścia , w przeciwnym razie będzie działać dość gwałtownie.

Nazwałem to 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;
}

Skompiluj i spróbuj

$ ./slowcat 10 < slowcat.c
dmckee
źródło
18
Teraz odczuwam okropną pokusę, aby dodać „stukot” hałasu do każdej postaci i ustawić domyślną prędkość na 40 CPS, z dodatkowym opóźnieniem dla nowych linii.
dmckee,
Użyłbym tego z jednym z tych wygaszaczy ekranu w stylu retro do chichotu, gdybym miał głośniki podłączone do moich urządzeń z systemem Linux.
Benny Mackney
4

przepustnica wydaje się specjalnie do tego zaprojektowana . na przykład

cat /dev/urandom | throttle -k 3 | foo
Ponkadoodle
źródło
1
Zgodziłbym się z tym, ale wydaje się, że nie ma standardowego pakietu dla Ubuntu. Nie widzę też kodu źródłowego. Czy ktoś wie, gdzie można uzyskać to narzędzie?
Benjamin Leinweber,
1
@BenjaminLeinweber Wygląda na to, że strona, która normalnie hostuje kod, jest offline, ale Freebsd ma źródło 1.2 dostępne na ich serwerze ftp . Musisz go tam pobrać i ./configure && make.
Ponkadoodle,
3

Oto kompleksowe rozwiązanie, które nie utraci wkładu (por. Pomysł głowy -1 Mike'a 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
BrianHoltz
źródło
2

Szybko i brudnie, cały czas cały shell (mam CentOS i pv domyślnie nie ma go):

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

... brudne, ponieważ chociaż ma ograniczoną stawkę, jest wybuchowe w tempie, którego nie mogę ci powiedzieć :-). Ale jest to przydatne, gdy potrzebujesz tylko przesłać dane z jednego miejsca do drugiego (robiłem kilka testów towarzyskich) i nie chcesz zamaczać ekranu śmieciami.

Mike S.
źródło