गैर-अवरुद्ध बफ़र नामित पाइप?


20

मैं कुछ ऐसी चीज़ों की तलाश कर रहा हूँ जिन पर मुझे संदेह नहीं है: कमांड लाइन से उपयोग करने के लिए एक नॉन-ब्लॉकिंग बफ़र नाम का पाइप (फिडो)। क्या वहां ऐसी कोई चीज है?

यहां उपयोग का मामला है: मान लीजिए कि मेरे पास एक ऐसी प्रक्रिया है जो पृष्ठभूमि में लंबे समय तक चलने वाली है और बहुत सारे आउटपुट के लिए है stdout। मैं वास्तव में आउटपुट के बारे में परवाह नहीं करता हूं और इसे स्टोर नहीं करना चाहता हूं (शायद मेरे पास पर्याप्त जगह नहीं है), लेकिन मैं समय-समय पर "ड्रॉप" करना चाहता हूं और इसका पालन कर रहा हूं, फिर बाहर छोड़ दें और इसे अपना काम करने के लिए छोड़ दें। इसलिए मैं इसके आउटपुट को इस सैद्धांतिक बफर, नॉन-ब्लॉकिंग पाइप और फिर समय-समय पर टैप करना चाहता हूं।

इसलिए मूल रूप से मैं इस तरह शुरू करना चाहता हूं ( 10Mबफर का आकार होना):

mkmagicfifo magicfifo 10M
spewingprocess > magicfifo &

... और समय-समय पर यह देखने के लिए कि क्या चल रहा है ...

tail -f magicfifo

... सभी आउटपुट को magicfifo स्टोर किए बिना (इसलिए, एक सामान्य फ़ाइल नहीं), और इसके बिना स्प्यूइंग प्रक्रिया को अवरुद्ध करने पर यह भर जाता है और टैप नहीं किया जाता है (इसलिए, काफी सामान्य नाम का पाइप नहीं)।

मुझे नहीं लगता कि समाधान शामिल हैं tailया pruneइसे करेंगे (ठीक है, मैं इसमें शामिल एक समाधान के बारे में सोच सकता हूं tail), क्योंकि tailअभी भी आवश्यकता होगी कि मैं सभी डेटा को कहीं स्टोर करूं (यदि मैं इसे देखना चाहता हूं और इसे देखने से बाहर छोड़ना चाहता हूं), और pruneफ़ाइल को फिर से लिखना होगा, संभवतः (मैं मानता हूँ कि मैंने कोशिश नहीं की है / यह साबित नहीं किया है) सभी आउटपुट उत्पन्न करने की प्रक्रिया के पुनर्निर्देशन को तोड़ना।

मुझे उम्मीद है कि मैं ऐसा करने के लिए कुछ उपयोगिता लिख ​​सकता हूं, लेकिन * nix में फ़ाइलों और पाइपों के बहुत सारे ठंडे पहलू हैं और इस तरह, मैं अभी मदद नहीं कर सकता लेकिन लगता है कि यह मौजूद है और मुझे अभी इसके बारे में पता नहीं है।

तो: क्या ऐसी कोई बात है, और यदि ऐसा है तो क्या है?


1
आप जो वर्णन कर रहे हैं वह एक "रिंग बफर" या "परिपत्र बफर" है। मैं इस तरह की चीज को बनाए रखने के लिए किसी भी कमांड लाइन टूल के बारे में नहीं जानता, हालांकि इसे बनाना तुच्छ होगा।
शॉन जे। गोफ

2
"लिनक्स नॉन-ब्लॉकिंग फ़ोरो (ऑन डिमांड लॉगिंग)", स्टैकओवरफ़्लो . com/questions/7360473/… में वर्णित समाधानों पर एक नज़र डालें ।

1
इस तरह दिखता है StackOverflow पर हल किया गया है: stackoverflow.com/questions/7360473/…
जेम्स ब्लैकबर्न

@JamesBlackburn: धन्यवाद! बहुत ही रोचक।
TJ क्राउडर

जवाबों:


16

मुझे लगता है कि आप जो खोज रहे हैं वह जीएनयू है screen। यह एक या अधिक प्रोग्राम से अंतिम स्क्रीन को आउटपुट के दो या दो पूर्ण रूप से रखने के लिए एक बफ़र रखता है और आपको बाद में डिस्कनेक्ट और वापस आने देता है।


स्क्रीन का सुझाव देने के लिए +1। BTW, आप इसे "इतिहास की बहुत सारी पंक्तियाँ" रखने के लिए कॉन्फ़िगर कर सकते हैं।
श्री शुंज

1
धन्यवाद। क्या आप इस बात का उदाहरण दे सकते हैं कि आपने अपने प्रश्न में मेरे द्वारा दिखाए गए आदेशों पर कैसे लागू होगा? मैन पेज कहता है कि यह एक विंडो मैनेजर है (मुझे लगता है कि वे एक टर्मिनल अर्थ में हैं, न कि एक चित्रमय अर्थ, लेकिन फिर भी)। और क्या मैं अभी भी (ssh के माध्यम से) ड्रॉप कर सकता हूँ और आवश्यकतानुसार बाहर छोड़ सकता हूँ? (जैसे, दूरस्थ सर्वर पर ऑप्स।)
टीजे क्राउडर

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

2
टर्मिनल मल्टीप्लेक्सर / सेशन मैनेजर एप्लिकेशन के एक ही वर्ग में कुछ भी tmuxऔर dtach- एक ही चीज हासिल करने में सक्षम होना चाहिए।
jw013

5

आप उपयोग कर सकते हैं pv, यह एक पाइपलाइन में जितना चाहें उतना बफरिंग प्रदान करता है। आप इसे इस तरह से उपयोग कर सकते हैं:

sprewingprocess | pv -B 1g > ordinaryfifo &

कि आप के बीच spewingprocessऔर पन्द्रह के 1GB बफरिंग के लिए देना होगा । अधिकांश लिनक्स वितरण pvनामक पैकेज में पेशकश करते हैं , यह विश्वास करते हैं या नहीं pv


धन्यवाद, लेकिन अगर मैं पाइप नाम के लक्ष्य को नहीं पढ़ रहा था तो एक बार बफर भर जाने पर वह ब्लॉक नहीं होगा?
टीजे क्राउडर

1
हां, लेकिन आपके पास क्या विकल्प है? एक परिमित ब्रह्मांड में, आप सचमुच असीमित बफरिंग नहीं कर सकते।
डेविड श्वार्ट्ज

अन्य विकल्प जैसा कि मैंने अपने प्रश्न में वर्णित किया है: सभी आउटपुट को संग्रहीत नहीं करना। जब बफर भर जाता है, तो सबसे पुराना सामान फेंक दिया जाता है।
टीजे क्राउडर

हम्म, मैंने इसका परीक्षण किया और यह दुर्भाग्य से पूरी तरह से काम नहीं करता है। यदि पानो को पढ़ने की प्रक्रिया थोड़ी देर के लिए पढ़ना बंद कर देती है, तो पिव ब्लॉक पंद्रह को लिखने की कोशिश कर रहा है, और क्योंकि यह मल्टीथ्रेडेड नहीं है, इसलिए यह पठन के डेटा को पिव के बफर में भी ब्लॉक करता है। तो pv का बफ़र केवल तभी भरना जारी रखेगा, जब तक कि पठन की प्रक्रिया पंद्रो पढ़ती रहे। pv कुछ डेटा को पढ़ने और बफर करने में सक्षम हो सकता है, लेकिन यह लेखक को पूरी तरह से अवरुद्ध होने से नहीं रोकता है।
डैनियल एस। स्टर्लिंग

1

मुझे भी यही समस्या थी। यह मेरा पहला उपाय है। पहले एक फाइल में आउटपुट लिखें जिसे हम प्रत्येक पंक्ति के बाद काटते हैं ताकि यह अनिश्चित काल तक न बढ़े:

spewingprocess | while read line; do echo $line > buffer.txt ; done

फिर पूंछ का उपयोग करके फ़ाइल से पढ़ें (जहां 2> /dev/null"फ़ाइल छलनी" त्रुटि संदेश से छुटकारा मिलता है):

tail -f ./buffer.txt 2> /dev/null

इस तरह से बफर नहीं बढ़ता है और हम मल्टीप्लेक्स कर सकते हैं, जैसे हम चाहते हैं के रूप में कई पूंछ चलाते हैं। हालांकि, इस दृष्टिकोण के साथ समस्या यह है कि हम डेटा खो सकते हैं जब हम पूंछ को तेजी से काटते हैं, जैसा कि यह परीक्षण दिखाता है:

for ((i=0; ; i++)) ; do echo "$i" ; done | while read line; do  echo $line > buffer.txt ; done
tail -f ./buffer.txt 2> /dev/null > log.txt

कुछ समय तक चलने के बाद पहली और अंतिम पंक्तियाँ इस प्रकार हैं:

$ head -n 1 log.txt
0
$ tail -n 1 log.txt
78783

लेकिन फ़ाइल में कम लाइनें हैं, इसलिए कुछ खो गए हैं:

$ wc log.txt
67087  67087 392819 log.txt

फिर भी यह एक अच्छा समाधान लगता है यदि आप डेटा हानि के बारे में इतना ध्यान नहीं रखते हैं या जब आपका स्पाइवप्रोसेस तेजी से डेटा खो जाने के लिए पर्याप्त नहीं है।

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