2012-07-18 15 views

उत्तर

12

बैश स्क्रिप्ट के पीआईडी ​​प्राप्त करने के लिए आप चर $$ का उपयोग कर सकते हैं।

फिर, अपने बच्चों प्राप्त करने के लिए, आप चला सकते हैं:

bash_pid=$$ 
children=`ps -eo ppid | grep -w $bash_pid` 

ps माता पिता PIDs की सूची वापस आ जाएगी। फिर grep बैश स्क्रिप्ट के बच्चों से संबंधित सभी प्रक्रियाओं को फ़िल्टर नहीं करता है। आदेश बच्चों की संख्या प्राप्त करने के लिए आप कर सकते हैं:

num_children=`echo $children | wc -w` 

असल नंबर पर आप, 1 से बंद हो जाएगा मिल जाएगा ps के बाद से पार्टी स्क्रिप्ट का एक बच्चा भी हो जाएगा। आप ps एक बच्चे के रूप के निष्पादन गिनती करने के लिए नहीं करना चाहते हैं, तो आप सिर्फ ठीक कर सकते हैं कि साथ:

let num_children=num_children-1 

अद्यतन: आदेश grep बुला बचने के लिए, निम्न सिंटैक्स का उपयोग किया जा सकता है (यदि समर्थित ps के स्थापित संस्करण) द्वारा:

num_children=`ps --no-headers -o pid --ppid=$$ | wc -w` 
+3

'grep -w $ bash_pid' यदि बैश पिड किसी बच्चे की प्रक्रिया आईडी का एक सबस्ट्रिंग है। – chepner

+0

@chepner अच्छा बिंदु! मैं इसे ठीक कर दूंगा। धन्यवाद! :) – betabandido

+0

यकीन नहीं है, लेकिन मुझे लगता है कि अतिरिक्त प्रक्रिया सबहेल है जिसमें ps/grep पाइपलाइन शामिल है।बस pedantic होने :) – chepner

2

--ppid विकल्प के साथ उपयोग ps वर्तमान बैश प्रक्रिया के बच्चों को चुनने के लिए।

bash_pid=$$ 
child_count=$(ps -o pid= --ppid $bash_id | wc -l) 
let child_count-=1 # If you don't want to count the subshell that computed the answer 

(नोट: इस --ppid के लिए ps का लिनक्स संस्करण की आवश्यकता है, अगर वहाँ बीएसडी ps या नहीं करने के लिए एक बराबर है मैं नहीं जानता।।)

+0

मेरे लिए काम नहीं करता है। मुझे एक 'पीएस: अवैध विकल्प - -' देता है। शायद आप पीएस का एक विशेष संस्करण मान रहे हैं? – ghoti

+0

हां, मैं लिनक्स द्वारा उपयोग किए गए संस्करण को मान रहा था। – chepner

+0

आह। मैंने फ्रीबीएसडी और ओएसएक्स पर परीक्षण किया। – ghoti

-2

आप की तरह खोल builtin आदेश नौकरियों का मूल्यांकन कर सकते हैं :

counter = `jobs | wc -l` 
+1

वह नौकरियों की गणना करता है, प्रक्रियाओं में नहीं। एक नौकरी में कई प्रक्रियाएं हो सकती हैं। – chepner

+1

बराबर चिह्न के आसपास कोई जगह नहीं है। बैकटीक्स के बजाय '$()' का उपयोग करें। –

4

तुम भी उपयोग कर सकते हैं pgrep:

child_count=$(($(pgrep --parent $$ | wc -l) - 1))

बैश प्रक्रिया के बच्चों की सूची प्राप्त करने के लिए pgrep --parent $$ का उपयोग करें।
तब लाइनों की संख्या प्राप्त करने के लिए उत्पादन पर wc -l का उपयोग करें: $(pgrep --parent $$ | wc -l) तो 1 (wc -l रिपोर्ट 1 यहां तक ​​कि जब pgrep --parent $$ खाली है)

3

घटाना मैं पसंद करते हैं:

num_children=$(pgrep -c -P$$)

यह सिर्फ एक spawns प्रक्रिया, आपको पाइप में प्रोग्रामों द्वारा शब्दों की गणना करने या पीआईडी ​​की संख्या समायोजित करने की आवश्यकता नहीं है।

उदाहरण:

~ $ echo $(pgrep -c -P$$) 
0 
~ $ sleep 20 & 
[1] 26114 
~ $ echo $(pgrep -c -P$$) 
1 
संबंधित मुद्दे