อัตรา จำกัด ท่อภายใต้ลินุกซ์ได้อย่างไร


58

มีตัวกรองที่ฉันสามารถใช้เพื่อ จำกัด อัตราของ pip บน linux หรือไม่? ถ้ามีอยู่ให้เรียกว่าขีด จำกัด อัตราฉันต้องการพิมพ์เทอร์มินัลอย่างเช่น

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

เพื่อส่งสตรีมแบบสุ่มไบต์ไปยังอินพุตมาตรฐานของ foo ในอัตรา (ต่ำกว่า) 3 kbytes / s


1
ฉันถามที่นี่เพราะฉันต้องการใช้ในโปรแกรมไม่ใช่สำหรับการแก้ไขปัญหา แต่นี่เป็นคำถามแรกของฉันที่นี่ดังนั้นฉันจึงขออภัยถ้าฉันทำผิด

1
BTW ข้างต้นเป็นการใช้งานที่ไม่จำเป็นของแมวคุณสามารถทำได้ rate-limit 3k < /dev/urandom | foo.
dmckee

คำตอบ:


80

Pipe Viewer มีคุณสมบัตินี้

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

1
ยังมีประโยชน์ในการใช้งานในขณะที่ดูผลลัพธ์ของงานด้วย -q... เช่น: command 2>&1 | pv -q -L 3k
Attie

17

ฉันจะบอกว่า Juliano ได้รับคำตอบที่ถูกต้อง หากคุณมีเครื่องมือนั้น แต่ฉันขอแนะนำด้วยว่านี่เป็นแบบฝึกหัดสไตล์ K & amp; R ตัวเล็ก ๆ น้อย ๆ : เพียงแค่เขียนแมวรุ่นพิเศษที่อ่านตัวละครตัวหนึ่งในเวลา stdinส่งออกแต่ละไป stdout แล้ว usleep ก่อนที่จะย้าย แน่ใจ เพื่อคลายออกเอาต์พุตมาตรฐาน หรือสิ่งนี้จะทำงานค่อนข้างกระตุก

ฉันเรียกสิ่งนี้ 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

17
ตอนนี้ฉันรู้สึกว่าการล่อลวงที่น่ากลัวในการเพิ่มเสียง "กระทบกัน" ให้กับตัวละครแต่ละตัวนั้นได้กำหนดความเร็วเริ่มต้นที่ 40 CPS โดยมีการหน่วงเวลาพิเศษสำหรับการขึ้นบรรทัดใหม่
dmckee

ฉันจะใช้มันกับหนึ่งในสกรีนเซฟเวอร์เทอร์มินัลย้อนยุคสำหรับหัวเราะคิกคักถ้าฉันมีลำโพงที่ติดกับกล่องลินุกซ์
Benny Mackney

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

1
ฉันเห็นด้วยกับสิ่งนี้ แต่ดูเหมือนจะไม่เป็นแพคเกจมาตรฐานสำหรับ Ubuntu ฉันยังไม่เห็นซอร์สโค้ดเหมือนกัน ใครรู้ว่าคุณจะได้รับยูทิลิตี้นี้ที่ไหน?
Benjamin Leinweber

1
@BenjaminLeinweber ดูเหมือนว่า เว็บไซต์ที่ปกติโฮสต์รหัส เป็นแบบออฟไลน์ แต่ freebsd มีแหล่งที่มาของ 1.2 สำหรับพวกเขา เซิร์ฟเวอร์ ftp . คุณจะต้องดาวน์โหลดที่นั่น & amp; ./configure && make.
Ponkadoodle

2

รวดเร็วและสกปรกเชลล์ทั้งหมดตลอดเวลา (ฉันมี CentOS และ pv ไม่ได้มาพร้อมกับค่าเริ่มต้น):

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

... สกปรกเพราะถึงแม้ว่ามันจะมี จำกัด แต่ก็มีอัตราที่ไม่สามารถบอกได้ :-) แต่มันมีประโยชน์เมื่อคุณต้องการส่งข้อมูลจากที่หนึ่งไปยังอีกที่หนึ่ง (ฉันทำการทดสอบ socat) และคุณไม่ต้องการที่จะล้นหน้าจอของคุณด้วยขยะ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.