बश लिपि 'जबकि GNU समानांतर के साथ चलने पर' लूप का कारण 'टूटी हुई पाइप' त्रुटि होती है


2

जीएनयू समानांतर मेलिंग सूची के अनुसार यह जीएनयू समानांतर-विशिष्ट समस्या नहीं है। उन्होंने सुझाव दिया कि मैं अपनी समस्या यहाँ पोस्ट करता हूँ।

मुझे जो त्रुटि मिल रही है वह "टूटी हुई पाइप" त्रुटि है, लेकिन मुझे लगता है कि मुझे पहले अपनी समस्या का संदर्भ स्पष्ट करना चाहिए और इस त्रुटि का कारण बनता है। यह तब होता है जब GNU समांतर में 'पढ़े जाते हैं' लूप युक्त किसी बैश स्क्रिप्ट का उपयोग करने की कोशिश की जाती है।

मेरे पास इस तरह से एक मूल बैश स्क्रिप्ट है:

#!/bin/bash
# linkcheck.sh

while read domain
do
host "$domain"
done

मान लें कि मैं एक बड़ी सूची (250mb कहना) में पाइप करना चाहता हूं।

cat urllist | ./linkcheck.sh

250mb लायक URL पर होस्ट कमांड चलाना धीमा है। चीजों को गति देने के लिए, मैं इनपुट को तोड़ने से पहले इसे विखंडू में तोड़ना चाहता हूं और फिर समानांतर में कई काम चलाते हैं। जीएनयू समानांतर ऐसा करने में सक्षम है।

cat urllist | parallel --pipe -j0 parallel ./linkcheck.sh {}

{} को urlist लाइन-बाय-लाइन की सामग्री द्वारा प्रतिस्थापित किया जाता है। मान लें कि मेरा सिस्टम डिफ़ॉल्ट सेटअप समानांतर के प्रति 500ish नौकरियों को चलाने में सक्षम है। इस सीमा को पूरा करने के लिए हम समानांतर खुद को समानांतर कर सकते हैं:

cat urllist | parallel -j10 --pipe parallel -j0 ./linkcheck.sh {}

यह 5000'ish नौकरियां चलाएगा। यह भी, दुख की बात है, त्रुटि "टूटी हुई पाइप" (बैश FAQ) का कारण होगी । फिर भी स्क्रिप्ट तब काम करना शुरू करती है जब मैं पढ़े गए लूप को हटा देता हूं और जो भी {{उदा।

#!/bin/bash
# linkchecker.sh

domain="$1"
host "$1"

कुछ समय के लूप के साथ काम क्यों नहीं करेगा? क्या "टूटी पाइप" संदेश को रोकने के लिए सिगिप सिग्नल को बंद करना सुरक्षित है, या डेटा भ्रष्टाचार जैसे दुष्प्रभाव होंगे?

पढ़ने के लिए धन्यवाद।

जवाबों:


1

इसलिए किया

बिल्ली का बच्चा | समानांतर -पाइप -j0 समानांतर ।/linkcheck.sh {}

सही ढंग से काम करें? मेरा मानना ​​है कि आपकी समस्या का हिस्सा यह हो सकता है कि आपने दूसरा छोड़ दिया है --pipe, जैसे कि

बिल्ली का बच्चा | समानांतर -j10 - समानांतर समानांतर -j0 -पाइप ./linkcheck.sh {}

 


BTW, आपको कभी कहने की ज़रूरत नहीं है

cat one_file | some_command

आप इसे हमेशा बदल सकते हैं

some_command < one_file

एक कम प्रक्रिया (और एक कम पाइप) के परिणामस्वरूप। ( catजब आपके पास एकाधिक इनपुट फ़ाइलें हों, तो इसका उपयोग करना उचित / आवश्यक हो सकता है ।)


धन्यवाद। दूसरा याद रखना - मेरी समस्या थी। मैं शपथ ले सकता था कि मैंने पहले ही कोशिश की थी, लेकिन जाहिर है कि नहीं।
जो व्हाइट

1
@ जो: इसके अलावा, यदि आप उपयोग कर रहे हैं, तो --pipeमुझे संदेह है कि {}यह अनावश्यक / अनदेखा है।
स्कॉट

0

यह मुझे प्रतीत होता है कि खराब दौड़ की स्थिति के कारण त्रुटि उत्पन्न हो सकती है क्योंकि खिड़की के बीच एक बच्चे को लिंकचेक की एक और प्रतिलिपि चलाने के लिए फोर्किंग के बीच। पाइप खुला रहने के दौरान और जब बच्चा वास्तव में पढ़ने की कोशिश करता है। उस विंडो में, एक और कॉपी ईओएफ पढ़ा है और पाइप बंद हो गया है।


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