Як нормувати обмеження на трубу під Linux?


63

Чи є фільтр, який я міг би використовувати для обмеження швидкості роботи на Linux? Якщо це існує, нехай називаємо це обмеженням швидкості, я хочу мати можливість ввести термінал на кшталт

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

для того, щоб відправити aa потік випадкових байтів на стандартний вхід foo зі швидкістю (нижче) 3 кбайт / с.


1
Я запитав тут, бо хочу використовувати його в програмі, а не для усунення несправностей. Але це моє найперше запитання тут, тому я вибачаюся, якщо допустив помилку.

1
До речі, вищезгадане - зайве використання кота, ви могли б зробити rate-limit 3k < /dev/urandom | foo.
dmckee

Відповіді:


91

Pipe Viewer має цю функцію.

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

1
Також зручно використовувати під час перегляду результатів роботи, -qнаприклад ...:command 2>&1 | pv -q -L 3k
Attie

17

Я б сказав, що Джуліано отримав правильну відповідь, якщо у вас є цей інструмент, але я б також запропонував, що це акуратне вправа в стилі K&R: просто напишіть спеціалізовану версію кішки, яка читає по одному символу за раз stdin, виводить кожен до, stdoutа потім usleeps перед тим, як рухатися далі. Не забудьте розблокувати стандартний вихід , інакше це буде працювати досить ривково.

Я назвав це 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

18
Тепер я відчуваю жахливу спокусу додати «клаксовий» шум кожному символу, встановити швидкість за замовчуванням 40 CPS, з додатковою затримкою для нових рядків.
dmckee

Я б використав це з однією з цих ретро-заставкових заставки для хихикання, якби у моїх linux-коробках були встановлені динаміки.
Бенні Макні

4

Дросель здається розроблений спеціально для цього. напр

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

1
Я погодився би з цим, але, здається, не існує стандартного пакету для Ubuntu. Я також не бачу вихідного коду для нього. Хтось знає, де можна отримати цю утиліту?
Бенджамін Лейнвебер

1
@BenjaminLeinweber Схоже, веб-сайт, який зазвичай розміщує код, є офлайн, але freebsd має джерело для 1.2, доступне на їх ftp-сервері . Вам доведеться завантажити його туди & ./configure && make.
Ponkadoodle

3

Ось комплексне рішення, яке не втратить вклад (див. Ідею 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

2

Швидкий і брудний, весь час оболонки (у мене CentOS і pv за замовчуванням не йде з ним):

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

... брудно, тому що, хоча вона обмежена швидкістю, вона лопне зі швидкістю, яку я не можу вам сказати :-). Але це зручно, коли вам просто потрібно надсилати дані з одного місця в інше (я робив кілька випробувань socat), і ви не хочете загравати ваш екран сміттям.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.