60

Есть ли фильтр, который я мог бы использовать для ограничения скорости канала в Linux? Если это существует, пусть это называется лимитом скорости, я хочу иметь возможность набирать в терминале что-то вроде

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

чтобы отправить поток случайных байтов на стандартный ввод foo со скоростью (ниже) 3 кбайт / с.

5 ответов5

82

Pipe Viewer имеет эту функцию.

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

Я бы сказал, что Джулиано получил правильный ответ, если у вас есть этот инструмент, но я также предположил бы, что это аккуратное маленькое упражнение в стиле K & R: просто напишите специализированную версию cat, которая читает один символ за раз из stdin , выводит каждый в стандартный stdout и затем usleep s, прежде чем двигаться дальше. Обязательно снимите буфер со стандартного вывода , иначе он будет работать довольно резко.

Я назвал это 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;
}

Скомпилируйте и попробуйте с

$ ./slowcat 10 < slowcat.c
4

Вот решение для всех оболочек, которое не потеряет ввод (см. Идею head -1 от 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
4

Дроссель, кажется, разработан специально для этого. например

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

Быстро и грязно, все оболочки все время (у меня CentOS и pv не поставляется с ним по умолчанию):

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

... грязный, потому что, хотя он ограничен в скорости, он взрывной со скоростью, которую я не могу вам сказать :-). Но это удобно, когда вам просто нужно отправить данные из одного места в другое (я делал несколько тестов socat), и вы не хотите забивать свой экран мусором.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .