कई प्रक्रियाओं से उत्पादन को बुरी तरह विलय से xargs को कैसे रोकें?


18

मैं xargsविकल्प के साथ उपयोग कर रहा हूं --max-args=0(वैकल्पिक रूप से -P 0)।

हालाँकि, stdoutउचित लाइन सेपरेशन के लिए प्रक्रियाओं का आउटपुट बिना स्ट्रीम में विलय हो जाता है । तो मैं अक्सर लाइनों के साथ समाप्त होता हूँ जैसे:

<start-of-line-1><line-2><end-of-line-1>

जैसा कि मैं पूरे पैटर्न पर अपने पैटर्न के egrepसाथ उपयोग कर रहा हूं यह मेरा परिणाम गड़बड़ कर रहा है।^xargs

क्या किसी तरह से xargsप्रक्रिया आउटपुट को लिखने के लिए बाध्य करने का कोई तरीका है (कोई भी आदेश, जब तक कि एक प्रक्रिया का आउटपुट सन्निहित है)?

या कोई और उपाय?

संपादित करें: उपयोग के मामले के बारे में अधिक जानकारी:

मैं अलग-अलग होस्ट से वेब पेज डाउनलोड और पार्स करना चाहता हूं। जैसा कि प्रत्येक पृष्ठ को लोड करने में एक सेकंड लगता है और कुछ दर्जन पृष्ठ हैं जो मैं अनुरोधों को समानांतर करना चाहता हूं।

मेरे आदेश का निम्नलिखित रूप है:

echo -n $IPs | xargs --max-args=1 -I {} --delimiter ' ' --max-procs=0 \
wget -q -O- http://{}/somepage.html | egrep --count '^string'

मैं बैश का उपयोग करता हूं और पर्ल की तरह कुछ नहीं क्योंकि होस्ट आईपी ($ आईपी वेरिएबल) और कुछ अन्य डेटा में शामिल डीएश फाइल से आता है।


क्या आप अपने प्रश्न के लिए अधिक पूर्ण उदाहरण दे सकते हैं? यह स्पष्ट नहीं है कि आप वर्तमान में कैसे या क्यों उपयोग कर रहे हैं xargs
कालेब

इसका समाधान कठिन होगा, किसी को प्रत्येक प्रक्रिया के लिए अलग फाइल डिस्क्रिप्टर का उपयोग करना होगा और लाइनों को इकट्ठा करने के लिए एक छोटे सर्वर का उपयोग करना होगा। xargsइस तरह की सुविधा प्रदान करने के लिए प्रतीत नहीं होता है।
स्टीफन जिमेनेज़

@ कालेब तुम वहाँ जाओ, आशा है कि यह मदद करता है :-)
Christoph Wurm

निश्चित रूप से एक हल्का समाधान नहीं है, लेकिन शायद आप makeनौकरी की सुविधा का उपयोग कर सकते हैं , मुझे लगता है कि makeआउटपुट लाइनों को ठीक से विलय करता है।
स्टेफेन जिमेनेज़

मदद --line-bufferedकरने के लिए ध्वज जोड़ रहा हैegrep
irvar

जवाबों:


6

यह काम कर जाना चाहिए:

echo -n $IPs | xargs --max-args=1 -I {} --delimiter ' ' --max-procs=0 \
  sh -c "wget -q -O- 'http://{}/somepage.html' | egrep --count '^string'" | \
  { NUM=0; while read i; do NUM=$(($NUM + $i)); done; echo $NUM; }

यहां विचार अलग-अलग गणना करने और अंत में इन्हें योग करने का है। अलग-अलग गणनाओं को मिश्रित करने के लिए पर्याप्त बड़ा होने पर विफल हो सकता है, लेकिन ऐसा नहीं होना चाहिए।


14

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

echo -n $IPs | parallel -d ' ' -j0 wget -q -O- http://{}/somepage.html | egrep --count '^string'

यदि आपका आईपी एक फ़ाइल में है, तो यह और भी बेहतर है:

cat IPs | parallel -j0 wget -q -O- http://{}/somepage.html | egrep --count '^string'

अधिक जानने के लिए इंट्रो वीडियो देखें: http://www.youtube.com/watch?v=OpaiGYxkSuQ


2
अच्छा उपकरण! इसके अलावा, मैं शर्त लगा रहा हूं कि कोई आपको बताएगा कि बिल्ली बहुत जल्द बेकार है।
स्टीफन जिमेनेज़

1
मुझे पता है। लेकिन मुझे पढ़ना आसान लगता है, और मैं आमतौर पर 48 कोर मशीनों पर काम करता हूं, इसलिए निष्क्रिय कोर में से कुछ के लिए कुछ अतिरिक्त घड़ी चक्र अभी भी एक समस्या है।
ओले तांगे

समानांतर काम के लिए एकदम सही होगा अगर यह डेबियन रिपॉजिटरी में था।
क्रिस्टोफ वर्म

1
@ लेगेट डेबियन में मोरटिल्सparallel से कमांड शामिल है , जो यहां पर्याप्त है:parallel -j99 -i sh -c 'wget -q -O- http://{}/somepage.html | egrep -c "^string"' -- $IPs
गिल्स

@Legate checkout build.opensuse.org/package/… .deb फाइल के लिए और बग पुश करने के लिए bugs.debian.org/cgi-bin/bugreport.cgi?bug=518696
ओले तांगे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.