समानांतर प्रक्रिया कैसे चलाएं और दोनों समाप्त होने पर आउटपुट को संयोजित करें


17

मेरे पास एक बैश शेल स्क्रिप्ट है जिसमें मैं लगभग 5 या 6 अलग-अलग कार्यक्रमों के माध्यम से कुछ डेटा को पाइप करता हूं और फिर अंतिम परिणाम एक टैब सीमांकित फ़ाइल में होता है।

मैं फिर एक समान समान डेटासेट और दूसरी फाइल के आउटपुट के लिए फिर से वही करता हूं।

फिर दोनों फाइलें तुलनात्मक विश्लेषण के लिए दूसरे प्रोग्राम में इनपुट कर रही हैं। सरल करना पसंद है

Data1 | this | that |theother | grep |sed | awk |whatever > Data1Res.csv
Data2 | this | that |theother | grep |sed | awk |whatever > Data2Res.csv
AnalysisProg -i Data1res.csv Data2res.csv

मेरा सवाल है: मैं एक ही समय पर चरण 1 और चरण 2 कैसे चला सकता हूं (जैसे कि उपयोग कर रहा हूं) और केवल चरण 3 (विश्लेषणप्रयोग) लॉन्च कर सकता हूं जब दोनों पूर्ण हों?

धन्यवाद

ps एनलिसिप्रोग स्ट्रीम या फिफो पर काम नहीं करेगा।



BTW, क्या आपके लिए पर्ल स्क्रिप्ट का उपयोग करना ठीक है? यह आपके लिए मामले को बहुत सरल कर सकता है और आप इस पोस्ट-प्रोसेसिंग को बहुत कुशलता से लागू कर सकते हैं और इसे समानांतर रूप से सरलता से चला सकते हैं।
बिचॉय

पर्ल..नहीं, नहीं :(
स्टीफन हेंडरसन

1
यहाँ मैं प्रदर्शित करता हूँ कि teeदो समवर्ती grepप्रक्रियाओं के साथ पाइपों में इनपुट को कैसे विभाजित किया जाए और इसे कैसे प्रोसेस किया जाए: unix.stackexchange.com/questions/120333/…
mikeserv

और यहाँ मैं प्रदर्शित करता हूँ कि कैसे सरल शेल कंस्ट्रक्शन का उपयोग पूरी तरह से एक प्रक्रिया को पृष्ठभूमि में करने के लिए किया जा nohupसकता है, लेकिन फिर भी प्रक्रिया के साथ संचार करने का एक साधन बनाए रख सकते हैं: unix.stackexchange.com/questions/121253/…
mikeserv

जवाबों:


27

का उपयोग करें wait। उदाहरण के लिए:

Data1 ... > Data1Res.csv &
Data2 ... > Data2Res.csv &
wait
AnalysisProg

मर्जी:

  • पृष्ठभूमि नौकरियों के रूप में Data1 और Data2 पाइप चलाएं
  • उनके खत्म होने का इंतजार करें
  • एनालिसिसप्रोग चलाएं।

देखें, उदाहरण के लिए, यह सवाल


Thx, यह अच्छा लग रहा है। अगर ऊपर काम नहीं करता है तो मैं यह कोशिश करूँगा।
स्टीफन हेंडरसन

Thx फिर, मैं इंतजार के बारे में पता था, लेकिन गुगली होने से थोड़ा उलझन में था कि यह अलग-अलग पीआईडी ​​आदि के साथ कैसे काम करता है .. मुझे लगता है कि अब मैं इसे देख रहा हूं कि यह सिर्फ "इंतजार" है
स्टीफन हेंडरसन

12

अगर आपके पास केवल 2 फाइलें हैं, तो cxw का जवाब कोई संदेह नहीं है। यदि 2 फाइलें सिर्फ उदाहरण हैं और आपके पास वास्तव में 10000 फाइलें हैं, तो '&' समाधान काम नहीं करेगा, क्योंकि यह आपके सर्वर को अधिभारित करेगा। उसके लिए आपको GNU समानांतर जैसे एक उपकरण की आवश्यकता है:

ls Data* | parallel 'cat {} | this | that |theother | grep |sed | awk |whatever > {}res.csv
AnalysisProg -i *res.csv

जीएनयू समानांतर के बारे में अधिक जानने के लिए:

  • एक त्वरित परिचय के लिए परिचय वीडियो देखें : https://www.youtube.com/playlist?list=PL284C9FF2488BC6V1
  • ट्यूटोरियल के माध्यम से चलो (आदमी समानांतर_tutorial)। आप कमांड लाइन आपको इसके लिए प्यार करेंगे।

हाय thx इस समय मेरे पास दो फाइलें हैं, लेकिन मेरे पास 24 प्रोसेसर हैं इसलिए मैं एक ही बार में कई जोड़ियों को आज़माने और चलाने के लिए प्रलोभित महसूस कर रहा था - हालांकि कंप्यूटिंग विज्ञान के व्यक्ति के रूप में मैं स्पष्ट नहीं हूं कि डिस्क पढ़ने वाली अड़चन इसे सार्थक बनाती है या नहीं। हो सकता है कि मैं इसे
स्टीफन हेंडरसन

@StephenHenderson आकार के आधार पर फाइलें अभी भी कैश में हो सकती हैं। यदि गति की आलोचनात्मकता आप केवल tmpfs का उपयोग कर सकते हैं (और फाइलें <<< तो आपकी RAM हैं)।
मैकीज पीचोटका

1
@StephenHenderson समानांतर नौकरियों की संख्या को -j के साथ समायोजित किया जा सकता है, इसलिए कोशिश -j4 और यदि सर्वर ओवरलोड नहीं करता है, -j6 आदि। लेकिन CTRL-C दबाने के लिए तैयार रहें: GNU समानांतर सर्वरों को जल्दी से लोड करने के लिए एक उत्कृष्ट उपकरण है। । इसके अलावा - लोड पर एक नज़र है।
ओले तांगे

1

ऐसा करने का एक तरीका कुछ ऐसा दिख सकता है:

AnalysisProg <<PREPROCESS /dev/stdin
$( 
{   process1=$( pipe | line | 1 >&2 & echo $! )
    process2=$( pipe | line | 2 >&2 & echo $! )
    while ps -p $process1 $process2 >/dev/null; do
        sleep 1
    done
} 2>&1
)
#END
PREPROCESS

इस तरह आप दोनों पाइपलाइनों की पृष्ठभूमि तैयार करते हैं, लेकिन फिर भी उनके आउटपुट में स्टैडेन के संयोजन से पहले निष्पादन को समाप्त करने की प्रतीक्षा करते हैं जिसका मूल्यांकन यहां एक दस्तावेज में किया गया है और उसे एनालिसिप्रोग को सौंप दिया गया है। यदि आप उपयोग कर सकते हैं waitतो यह while psलूप से भी बेहतर है , लेकिन, शेल पर निर्भर करता है, waitअगर आप इसे एक ऐसी प्रक्रिया पर प्रतीक्षा करने का निर्देश दे सकते हैं जो वर्तमान शेल का बच्चा नहीं है।

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

AnalysisProg 3<<PREPROCESS /dev/fd/3 /dev/stderr
$(
process1=$(... >&2 ...) 2>/dev/fd/3
...
} 3>/dev/fd/3 2>/dev/stderr
)

मैंने पहले इन अवधारणाओं को प्रदर्शित किया है। संभवतः सर्वश्रेष्ठ डेमो यहां और यहां हैं


0

इस का उपयोग करने की कोशिश करो।

rm -f Data1Res.csv
rm -f Data2Res.csv
Data1 | this | that |theother | grep |sed | awk |whatever > Data1Res.csv &
Data2 | this | that |theother | grep |sed | awk |whatever > Data2Res.csv &
while true
do
  ps aux | grep -v grep | grep -i -E 'Data1Res.csv|Data2Res.csv' &> /dev/null
  if [ $? -ne 0 ]
  then
    AnalysisProg -i Data1res.csv Data2res.csv
    exit 0
  fi
done

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