Làm thế nào để đánh giá giới hạn một đường ống trong linux?


63

Có bộ lọc nào tôi có thể sử dụng để giới hạn tỷ lệ một đường ống trên linux không? Nếu điều này tồn tại, hãy gọi nó là giới hạn tỷ lệ, tôi muốn có thể nhập vào một thiết bị đầu cuối giống như

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

để gửi một luồng byte ngẫu nhiên đến đầu vào tiêu chuẩn của foo với tốc độ (thấp hơn) 3 kbyte / s.


1
Tôi hỏi ở đây vì tôi muốn sử dụng nó trong một chương trình, không phải để khắc phục sự cố. Nhưng đó là câu hỏi đầu tiên của tôi ở đây vì vậy tôi xin lỗi nếu tôi mắc lỗi.

1
BTW, ở trên là việc sử dụng mèo không cần thiết, bạn có thể làm rate-limit 3k < /dev/urandom | foo.
dmckee 17/03/2016

Câu trả lời:


91

Người xem ống có tính năng này.

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

1
Cũng thuận tiện để sử dụng trong khi xem đầu ra của một công việc, với -q... ví dụ:command 2>&1 | pv -q -L 3k
Attie

17

Tôi muốn nói rằng Juliano đã có câu trả lời đúng nếu bạn có công cụ đó, nhưng tôi cũng muốn đề nghị rằng đây là một chút K & R phong cách tập thể dục gọn gàng: chỉ cần viết một phiên bản đặc biệt của mèo mà đọc một ký tự cùng một lúc từ stdin, kết quả đầu ra từng đến stdoutvà sau đó usleeps trước khi di chuyển trên. Hãy chắc chắn để giải nén đầu ra tiêu chuẩn , nếu không điều này sẽ chạy khá giật.

Tôi gọi nó là 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;
}

Biên dịch nó và thử với

$ ./slowcat 10 < slowcat.c

18
Bây giờ tôi đang cảm thấy sự cám dỗ khủng khiếp khi thêm tiếng ồn "clack" cho mỗi nhân vật, đặt tốc độ mặc định thành 40 CPS, với độ trễ thêm cho các dòng mới.
dmckee 17/03/2016

Tôi sẽ sử dụng nó với một trong những trình bảo vệ màn hình đầu cuối retro để cười khúc khích nếu tôi có loa được gắn vào hộp linux của mình.
Benny Mackney

4

van tiết lưu dường như được thiết kế đặc biệt cho việc này. ví dụ

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

1
Tôi đồng ý với điều này, nhưng dường như không có gói tiêu chuẩn nào cho Ubuntu. Tôi cũng không thấy mã nguồn cho nó. Bất cứ ai biết nơi bạn có thể nhận được tiện ích này?
Benjamin Leinweber

1
@BenjaminLeinweber Có vẻ như trang web thường lưu trữ mã ngoại tuyến, nhưng freebsd có nguồn cho 1,2 có sẵn trên máy chủ ftp của họ . Bạn sẽ phải tải nó ở đó & ./configure && make.
Ponkadoodle

3

Đây là một giải pháp toàn bộ sẽ không mất đầu vào (xem ý tưởng đầu -1 từ 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

Nhanh và bẩn, mọi lúc mọi nơi (tôi có CentOS và pv không đi kèm với nó theo mặc định):

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

... bẩn vì mặc dù tốc độ giới hạn, nhưng nó bùng nổ ở tốc độ mà tôi không thể nói với bạn :-). Nhưng thật tiện lợi khi bạn chỉ cần gửi dữ liệu từ nơi này sang nơi khác (tôi đang thực hiện một số bài kiểm tra xã hội) và bạn không muốn làm ngập màn hình của mình với rác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.