एक स्क्रिप्ट द्वारा पैदा की गई सभी बाल प्रक्रिया की सूची कैसे प्राप्त करें


10

प्रसंग:

उपयोगकर्ता मुझे चलाने के लिए अपनी कस्टम स्क्रिप्ट प्रदान करते हैं। ये स्क्रिप्ट कई तरह के हो सकते हैं जैसे कई GUI प्रोग्राम शुरू करने के लिए स्क्रिप्ट, बैकएंड सेवाएं। लिपियों को कैसे लिखा जाता है, इस पर मेरा कोई नियंत्रण नहीं है। ये स्क्रिप्ट ब्लॉकिंग प्रकार की हो सकती हैं अर्थात निष्पादन सभी बच्चे की प्रक्रियाओं (क्रमिक रूप से चलने वाले प्रोग्राम) से बाहर निकलने तक प्रतीक्षा करता है

#exaple of blocking script
echo "START"
first_program 
second_program 
echo "DONE"

या नॉन ब्लॉकिंग टाइप यानी बैकग्राउंड में बच्चे की प्रक्रिया को कांटे और कुछ से बाहर निकलें

#example of non-blocking script
echo "START"
first_program &
second_program &
echo "DONE"

मैं क्या हासिल करने की कोशिश कर रहा हूं?

उपयोगकर्ता प्रदान की गई लिपियाँ उपरोक्त दोनों प्रकारों में से किसी एक या दोनों के मिश्रण की हो सकती हैं। मेरा काम स्क्रिप्ट को चलाना है और तब तक इंतजार करना है जब तक कि सभी प्रक्रियाएं उसके द्वारा शुरू न हो जाएं और फिर नोड को बंद कर दें। यदि इसका अवरोधन प्रकार है, तो मामला सरल है अर्थात स्क्रिप्ट निष्पादन प्रक्रिया की PID प्राप्त करें और ps -ef तक प्रतीक्षा करें | grep -ef PID में अधिक प्रविष्टियाँ नहीं हैं। गैर-अवरुद्ध स्क्रिप्ट मुझे परेशानी दे रही है

क्या कोई ऐसा तरीका है जिससे मैं स्क्रिप्ट के निष्पादन द्वारा पैदा की गई सभी बाल प्रक्रिया के पीआईडी ​​की सूची प्राप्त कर सकता हूं? किसी भी संकेत या संकेत अत्यधिक सराहना की जाएगी


मुझे नहीं लगता कि मूल स्क्रिप्ट समाप्त होने के बाद यह संभव है जब तक कि आप माता-पिता की पीआईडी ​​पर कब्जा नहीं कर सकते। यदि आप स्क्रिप्ट्स लॉन्च कर रहे हैं, तो आप उन्हें कुछ इस तरह से लपेट सकते हैं, जिससे आपको pid$(foo.sh; echo $!)पीआईडी ​​मिल जाएगी । क्या वह काम करेगा? foo.shps --ppid
टेराडन

2
क्या स्क्रिप्ट को लेखक उपयोगकर्ता के यूआईडी के तहत चलाना है? यदि नहीं, तो क्या आप इस उद्देश्य के लिए एक डमी उपयोगकर्ता बना सकते हैं? तुम भी जरूरत नहीं होगी grep, बस ps –udummy_user। इसके अलावा, प्रक्रिया समूहों को देखें।
स्कॉट

यह आपके प्रारंभिक प्रश्न के समाधान की तुलना में अधिक प्रकार का वर्कअराउंड है: नया बैश सत्र खोलें। आप psबिना किसी तर्क (केवल bashऔर psशुरुआत में) का उपयोग करके इस शेल से उत्पन्न सभी प्रक्रियाओं को सूचीबद्ध कर सकते हैं । वहां अपनी स्क्रिप्ट शुरू करें। इसके समाप्त होने के बाद, ps | wc -lअपने अपेक्षित मूल्य तक पहुंचने तक प्रतीक्षा करें ।
टिम

जवाबों:


8

सीधे अपने प्रश्न का उत्तर देने के लिए, कमांड

jobs -p

आपको सभी बाल प्रक्रियाओं की सूची देता है।

वैकल्पिक # 1

लेकिन आपके मामले में waitबिना किसी परम के आदेश का उपयोग करना आसान हो सकता है :

first_program &
second_program &
wait

यह तब तक इंतजार करेगा जब तक सभी बच्चे की प्रक्रिया समाप्त नहीं हो जाती।

वैकल्पिक # 2

एक अन्य विकल्प $!अंतिम कार्यक्रम की पीआईडी ​​प्राप्त करने के लिए उपयोग कर रहा है और शायद एक चर में जमा होता है, जैसे:

pids=""
first_program &
pids="$pids $!"
second_program &
pids="$pids $!"

और फिर उसके साथ प्रतीक्षा का उपयोग करें (यह उस स्थिति में है जब आप केवल बच्चे प्रक्रियाओं के सबसेट का इंतजार करना चाहते हैं)

wait $pids

वैकल्पिक # 3

या, यदि आप केवल किसी प्रक्रिया के समाप्त होने तक इंतजार करना चाहते हैं, तो आप उपयोग कर सकते हैं

wait -n $pids

बोनस की जानकारी

यदि आप अपने बच्चे की प्रक्रियाओं को बंद करने के लिए अपनी बैश स्क्रिप्ट के लिए एक संकेत चाहते हैं, तो आपको कुछ इस तरह से संकेत का प्रचार करने की आवश्यकता होगी (किसी भी प्रक्रिया को शुरू करने से पहले इसे शीर्ष पर कहीं रख दें):

trap 'kill $(jobs -p)' SIGINT SIGTERM EXIT

1

आपकी प्रतिक्रिया के लिए धन्यवाद दोस्तों .. मुझे स्टैकओवरफ़्लो पर समाधान मिला

आप उपयोगकर्ता द्वारा शुरू की गई सभी पृष्ठभूमि प्रक्रियाओं को पूरा करने के लिए प्रतीक्षा करने के लिए प्रतीक्षा का उपयोग कर सकते हैं। चूंकि प्रतीक्षा केवल वर्तमान शेल के बच्चों पर काम करती है, इसलिए आपको इसे अलग प्रक्रिया के रूप में चलाने के बजाय उनकी स्क्रिप्ट को स्रोत बनाना होगा।

(स्रोत उपयोगकर्ता नाम; प्रतीक्षा करें)

एक स्पष्ट उपधारा में स्क्रिप्ट को सोर्स करना एक नई प्रक्रिया को पर्याप्त रूप से शुरू करने के लिए अनुकरण करना चाहिए। यदि नहीं, तो आप उपधारा को भी पृष्ठभूमि दे सकते हैं, जो एक नई प्रक्रिया को शुरू करने के लिए मजबूर करता है, फिर इसके पूरा होने की प्रतीक्षा करें।

(स्रोत उपयोगकर्ता नाम; प्रतीक्षा करें) और प्रतीक्षा करें

यहाँ मूल उत्तर के लिए लिंक है @chepner: /programming/18663196/how-to-get-list-of-all-child-process-spawned-by-a-script-18663969?noredirect = 1 # 18,663,969


3
मैं इस बारे में के रूप में अच्छी तरह से सोचा है, लेकिन इस समाधान में विफल रहता है जब userscript पृष्ठभूमि में एक सबस्क्रिप्ट जो तब पृष्ठभूमि में एक और स्क्रिप्ट शुरू होता है शुरू होता है। आपका waitआदेश तो के बच्चों के लिए इंतजार करेंगे userscript अपने पोते के लिए नहीं बल्कि।
टिम

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