2011-05-08 17 views
5

दिखाने के लिए 'कम' कमांड द्वारा लिया गया समय मेरे पास एक ऐसी स्क्रिप्ट है जो बहुत अधिक उत्पादन उत्पन्न करती है। स्क्रिप्ट T पर कुछ सेकंड के लिए रुक जाती है।आउटपुट

अब मैं स्क्रिप्ट के आउटपुट का विश्लेषण करने के लिए less कमांड का उपयोग कर रहा हूं। तो मैं ./script | less निष्पादित करता हूं। मैं इसे पर्याप्त समय के लिए चल रहा हूं ताकि लिपि निष्पादन समाप्त कर दे।

अब मैं पीजी डाउन कुंजी दबाकर कम कमांड के आउटपुट के माध्यम से जाता हूं। आश्चर्यजनक रूप से आउटपुट के T पर स्क्रॉल करते समय मुझे कुछ सेकंड की रोकथाम दिखाई देती है।

स्क्रिप्ट किसी भी इनपुट की अपेक्षा नहीं करता है और जब तक मैं कम उत्पादन का विश्लेषण शुरू करता हूं तब तक निश्चित रूप से पूरा हो जाता।

क्या कोई बता सकता है कि स्क्रिप्ट निष्पादित होने पर कम से कम आउटपुट में कुछ सेकंड की रोकथाम कितनी उल्लेखनीय है?

+0

शायद आउटपुट के उस विशेष पृष्ठ में टेक्स्ट की एक बड़ी मात्रा है, उदाहरण के लिए यदि एक बहुत लंबी क्षैतिज रेखा है। – ninjagecko

उत्तर

8

आपकी स्क्रिप्ट less के साथ पाइप के माध्यम से संचार कर रही है। पाइप बाइट्स की एक इन-मेमोरी स्ट्रीम है जो दो एंडपॉइंट्स को जोड़ती है: आपकी स्क्रिप्ट और less प्रोग्राम, इसके लिए पूर्व लेखन आउटपुट, बाद में इसे पढ़ना।

जैसे-जैसे पाइप इन-मेमोरी हैं, अगर वे मनमाने ढंग से बड़े होते हैं तो यह सुखद नहीं होगा। इसलिए, डिफ़ॉल्ट रूप से, किसी भी पल में पाइप के अंदर हो सकता है (लिखित, लेकिन अभी तक नहीं पढ़ा गया) डेटा की एक सीमा है। डिफ़ॉल्ट रूप से यह लिनक्स पर 64k है। यदि पाइप भरा हुआ है, और आपकी स्क्रिप्ट इसे लिखने की कोशिश करती है, तो लिखने वाले ब्लॉक। तो आपकी स्क्रिप्ट वास्तव में काम नहीं कर रही है, यह किसी बिंदु पर रुक गई है जब write() कॉल पर कॉल करें।

इसे कैसे दूर करें? डिफ़ॉल्ट समायोजन एक बुरा विकल्प है; इसका उपयोग पाठक में एक बफर आवंटित करने के बजाय किया जाता है, ताकि यह बफर में पढ़ सके, पाइप को मुक्त कर दे और इस प्रकार लेखन कार्यक्रम को काम करने दे, लेकिन आउटपुट का केवल एक हिस्सा आपको (या हैंडल) दिखाता है। less में ऐसा बफर है, और, डिफ़ॉल्ट रूप से, इसे स्वचालित रूप से फैलाता है, हालांकि, यह पृष्ठभूमि में इसे भरता नहीं है, यह केवल इनपुट को पढ़ते ही इसे भरता है।

तो क्या आपकी समस्या को अंत तक फ़ाइल पढ़ रहा है (जैसा आप आमतौर पर जी प्रेस होगा), और फिर शुरुआत के लिए वापस जा (जैसा आप आमतौर पर जी प्रेस होगा) का समाधान होगा।

./script | less +Gg 

आप को ध्यान देना चाहिए तथापि, कि आप पूरी स्क्रिप्ट की स्मृति में उत्पादन भार तक इंतजार करना होगा, ताकि आप में सक्षम नहीं होगा: बात यह है कि आप इस तरह कमांड लाइन के माध्यम से इन आदेशों को निर्दिष्ट कर सकता है इसे एक बार में देखने के लिए। less इसके लिए अपर्याप्त रूप से परिष्कृत है।लेकिन अगर है कि तुम सच (ब्राउज़ कर उत्पादन की शुरुआत ./script अभी भी अपने अंत की गणना है, जबकि) की आवश्यकता है, तो आप एक अस्थायी फ़ाइल का उपयोग करना चाहें:

./script >x & less x ; rm x 
+0

क्या होगा यदि स्क्रिप्ट मानक आउटपुट और segfaults के बीच कहीं भी लिखता है। Segfault buffered आउटपुट को फ़ाइल x में लिखे जाने से रोक सकता है। ऐसा इसलिए है क्योंकि फ़ाइल में आउटपुट डिफ़ॉल्ट रूप से बफर किया जाता है और लाइन buffered नहीं है। क्या मैं स्क्रिप्ट पर लाइन बफरिंग को बाहरी रूप से लागू कर सकता हूं? क्या मैं शेल्फ छद्म टीटीआई उपयोगिता का उपयोग कर सकता हूं? –

2

पाइप ओएस स्तर पर भरा हुआ है, इसलिए script ब्लॉक less इसमें से कुछ उपभोग करते हैं।

+0

यह बहुत आसानी से टेस्टेबल लगता है, अगर आप टेक्स्ट को आउटपुट करते समय लॉग फ़ाइल में चीजों को उत्सर्जित करने के लिए अपनी स्क्रिप्ट प्राप्त करते हैं। – ninjagecko

2

प्रवाह नियंत्रण। आपकी स्क्रिप्ट को प्रभावी रूप से रोका जा रहा है जबकि पेजिंग कम है।

आप सुनिश्चित करें कि आपके आदेश से पहले आप कम सहभागी का उपयोग पूरा करता है बनाना चाहते हैं, less +G के रूप में कम आह्वान और यह इनपुट के अंत तक पढ़ा जाएगा, तो आप कम में 1G टाइप करके शुरू करने के लिए लौट सकते हैं।

2

कुछ पृष्ठभूमि जानकारी के लिए द्वारा भी वहाँ एक अच्छा लेख अलेक्जेंडर सैंडलर ने "इनपुट को कितनी कम प्रक्रिया" कहा!

http://www.alexonlinux.com/how-less-processes-its-input

+0

अच्छा लेख टिफ़ो –

0
Can I externally enforce line buffering on the script? 
Is there an off the shelf pseudo tty utility I could use? 

आप लाइन-बफरिंग उत्पादन मोड चालू करने की script आदेश का उपयोग करने की कोशिश कर सकते हैं।

script -q /dev/null ./script | less  # FreeBSD, Mac OS X 
script -c "./script" /dev/null | less # Linux 

इस संबंध में अधिक विकल्पों के लिए कृपया देखें: Turn off buffering in pipe