लाइनक्स के तहत एक पाइप को कैसे सीमित करें?


63

क्या एक फिल्टर है जो मैं लिनक्स पर एक पाइप को सीमित करने के लिए उपयोग कर सकता हूं? यदि यह मौजूद है, तो इसे दर-सीमा कहें, मैं चाहता हूं कि मैं टर्मिनल में कुछ टाइप कर सकूं

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

एक दर पर foo के मानक इनपुट के लिए यादृच्छिक बाइट्स की एक धारा भेजने के लिए (से कम) 3 kbytes / s।


1
मैंने यहां पूछा क्योंकि मैं इसे एक कार्यक्रम में उपयोग करना चाहता हूं, समस्या निवारण के लिए नहीं। लेकिन यह मेरा पहला प्रश्न है, अगर मैंने कोई त्रुटि की है तो मैं माफी चाहता हूं।

1
BTW, ऊपर बिल्ली का एक अनावश्यक उपयोग है, आप कर सकते हैं rate-limit 3k < /dev/urandom | foo
dmckee

जवाबों:


91

पाइप व्यूअर में यह सुविधा है।

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

1
नौकरी के आउटपुट को देखते हुए उपयोग करना भी आसान है, -qजैसे ... जैसे:command 2>&1 | pv -q -L 3k
Attie

17

मैं कहूंगा कि जूलियानो को यदि आपके पास वह टूल है तो सही उत्तर मिल गया है , लेकिन मैं यह भी सुझाव दूंगा कि यह एक साफ-सुथरा छोटा कश्मीर एंड आर स्टाइल एक्सरसाइज है: बिल्ली के एक विशेष संस्करण को लिखिए 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

18
अब मैं प्रत्येक चरित्र में "क्लैक" शोर जोड़ने के लिए भयानक प्रलोभन महसूस कर रहा हूं, जो कि 40 सीपीएस के लिए डिफ़ॉल्ट गति सेट करता है, जिसमें न्यूलाइन्स के लिए अतिरिक्त विलंब होता है।
dmckee

अगर मैं अपने लिनक्स बॉक्स से जुड़े स्पीकर रखता तो मैं उन रेट्रो टर्मिनल स्क्रीनसेवर में से एक के साथ प्रयोग करता।
बेनी मैकेनी

4

थ्रोटल विशेष रूप से इसके लिए डिज़ाइन किया गया लगता है । जैसे

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

1
मैं इससे सहमत हूं, लेकिन उबंटू के लिए कोई मानक पैकेज नहीं है। मैं इसके लिए सोर्स कोड भी नहीं देख रहा हूं। किसी को पता है कि आप इस उपयोगिता को कहां प्राप्त कर सकते हैं?
बेंजामिन लेनिवेबर

1
@BenjaminLeinweber यह वेबसाइट की तरह दिखता है जो सामान्य रूप से कोड को ऑफ़लाइन होस्ट करता है, लेकिन freebsd के पास 1.2 फीट का स्रोत उनके ftp सर्वर पर उपलब्ध है । आप इसे वहाँ और डाउनलोड करने के लिए होता है ./configure && make
पोंगडूडल

3

यहाँ एक सभी-शेल समाधान है जो इनपुट नहीं खोएगा (cf. हेड -1 विचार माइक एस से):

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

त्वरित और गंदे, हर समय सभी शेल (मेरे पास सेंटोस और पीवी डिफ़ॉल्ट रूप से इसके साथ नहीं आते हैं):

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

... गंदा क्योंकि यह सीमित है, यह एक दर है कि मैं आपको बता नहीं सकता है पर है :-)। लेकिन यह तब आसान होता है जब आपको सिर्फ एक जगह से दूसरी जगह डेटा भेजने की जरूरत होती है (मैं कुछ सोसाइटी टेस्ट कर रहा था) और आप अपनी स्क्रीन को कचरे के साथ नहीं बदलना चाहते।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.