Bagaimana cara menilai-membatasi pipa di linux?

63

Apakah ada filter yang bisa saya gunakan untuk menilai-membatasi pipa di linux? Jika ini ada, sebut saja batas-tingkat, saya ingin bisa mengetikkan terminal seperti ini

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

untuk mengirim aliran byte acak ke input standar foo dengan kecepatan (lebih rendah dari) 3 kbytes / s.

Frédéric Grosshans
sumber
1
Saya bertanya di sini karena saya ingin menggunakannya dalam suatu program, bukan untuk pemecahan masalah. Tapi ini pertanyaan pertama saya di sini jadi saya minta maaf jika saya membuat kesalahan.
1
BTW, di atas adalah penggunaan kucing yang tidak perlu, Anda bisa melakukannya rate-limit 3k < /dev/urandom | foo.
dmckee

Jawaban:

91

Pipe Viewer memiliki fitur ini.

cat /dev/urandom | pv -L 3k | foo
Juliano
sumber
1
Juga berguna untuk digunakan saat menonton output suatu pekerjaan, dengan -q... misalnya:command 2>&1 | pv -q -L 3k
Attie
17

Saya akan mengatakan bahwa Juliano telah mendapatkan jawaban yang tepat jika Anda memiliki alat itu, tetapi saya juga menyarankan bahwa ini adalah latihan gaya K&R kecil yang rapi: cukup tulis versi khusus kucing yang membaca satu karakter pada satu waktu dari stdin, keluaran masing-masing ke stdoutdan kemudian usleepsebelum melanjutkan. Pastikan untuk tidak membangun keluaran standar , atau ini akan berjalan agak tersentak-sentak.

Saya menyebut ini 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;
}

Kompilasi dan coba dengan

$ ./slowcat 10 < slowcat.c
dmckee
sumber
18
Sekarang saya merasakan godaan yang mengerikan untuk menambahkan "clack" noise ke setiap karakter dan mengatur kecepatan default ke 40 CPS, dengan penundaan tambahan untuk baris baru.
dmckee
Saya akan menggunakannya dengan salah satu screensaver terminal retro untuk terkikik jika saya memiliki speaker yang terpasang pada kotak linux saya.
Benny Mackney
4

throttle tampaknya dirancang khusus untuk ini. misalnya

cat /dev/urandom | throttle -k 3 | foo
Ponkadoodle
sumber
1
Saya setuju dengan ini, tetapi sepertinya tidak ada paket standar untuk Ubuntu. Saya juga tidak melihat kode sumber untuk itu. Adakah yang tahu di mana Anda bisa mendapatkan utilitas ini?
Benjamin Leinweber
1
@BenjaminLeinweber Sepertinya situs web yang biasanya meng-host kode sedang offline, tetapi freebsd memiliki sumber untuk 1.2 tersedia di server ftp mereka . Anda harus mengunduhnya di sana & ./configure && make.
Ponkadoodle
3

Berikut ini adalah solusi lengkap yang tidak akan kehilangan input (lihat ide head -1 dari 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
BrianHoltz
sumber
2

Cepat dan kotor, semua shell setiap saat (saya punya CentOS dan pv tidak datang dengan itu secara default):

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

... kotor karena meskipun kursnya terbatas, itu meledak pada tingkat yang saya tidak bisa memberi tahu Anda :-). Tapi ini berguna ketika Anda hanya perlu mengirim data dari satu tempat ke tempat lain (saya sedang melakukan beberapa tes socat) dan Anda tidak ingin membanjiri layar Anda dengan sampah.

Mike S
sumber