2010-06-17 10 views
15

के माध्यम से लिनक्स में प्रक्रिया की गिनती ढूँढना मैं लिनक्स में कमांड लाइन के माध्यम से उसी नाम के साथ चल रही प्रक्रियाओं की संख्या को खोजने का सबसे अच्छा तरीका ढूंढ रहा था। उदाहरण के लिए यदि मैं चल रही बैश प्रक्रियाओं की संख्या खोजना चाहता हूं और "5" प्राप्त करना चाहता हूं। वर्तमान में मेरे पास एक स्क्रिप्ट है जो 'पिडॉफ' करती है और फिर टोकनयुक्त स्ट्रिंग पर गिनती करती है। यह ठीक काम करता है लेकिन मैं सोच रहा था कि क्या एक बेहतर तरीका है जिसे कमांड लाइन के माध्यम से पूरी तरह से किया जा सकता है। आपकी सहायता के लिये पहले से ही धन्यवाद।कमांड लाइन

उत्तर

46

प्रणाली है कि है pgrep उपलब्ध पर, -c विकल्प प्रक्रियाओं है कि दिए गए नाम से मेल

pgrep -c command_name 

नोट की संख्या की गिनती देता है कि यह एक grep शैली मैच, नहीं एक सटीक है मैच, तो उदाहरण के लिए pgrep shbash प्रक्रियाओं से भी मेल खाएगा। यदि आप एक सटीक मिलान चाहते हैं, तो -x विकल्प का भी उपयोग करें।

यदि pgrep उपलब्ध नहीं है, तो आप ps और wc का उपयोग कर सकते हैं।

ps -C command_name --no-headers | wc -l 

ps करने के लिए -C विकल्प एक तर्क के रूप command_name लेता है, और कार्यक्रम प्रक्रियाओं जिसका निष्पादन योग्य नाम दिया आदेश नाम से मेल खाता के बारे में जानकारी की एक तालिका प्रिंट करता है। यह एक सटीक मैच है, grep-स्टाइल नहीं। --no-headers विकल्प तालिका के शीर्षकों को दबा देता है, जो आमतौर पर पहली पंक्ति के रूप में मुद्रित होते हैं। --no-headers के साथ, आपको मिलान की प्रति पंक्ति एक पंक्ति मिलती है। फिर wc -l इसकी इनपुट में लाइनों की संख्या की गणना करता है और प्रिंट करता है।

+1

हेडर को पोंछना किसी कारण से अच्छा है, जब मैं ps चलाता हूं तो 2 प्रक्रियाएं होती हैं और जब मैं ' पीएस - नो-हेडर | wc -l' 3 प्रक्रियाएं हैं। ऐसा लगता है कि प्रारंभिक नई लाइन गिनती है? – CMCDragonkai

+1

हम्म, ऐसा लगता है कि 'pgrep -c' ओपनबीएसडी/डार्विन पर एक विकल्प नहीं है। क्या आप थोड़ा झगड़ा जोड़ सकते हैं कि आपने उन झंडे क्यों चुने हैं (दोनों आदेशों के लिए)? कुछ स्पष्टीकरण के बिना उपयोगकर्ताओं को आपके इरादे का प्रयास करने और अनुवाद करने के लिए 'मैन' पृष्ठ का उपयोग करने के लिए एक अलग डिस्ट्रो पर भी मुश्किल बनाता है ... – cwd

+0

@cwd यकीन है, मैंने संपादित किया है। –

9
result=`ps -Al | grep command-name | wc -l` 
echo $result 
+0

यह वास्तव में क्या है मैं देख रहा था :) –

0

बाद बैश स्क्रिप्ट एक क्रॉन जॉब के रूप में चलाया जा सकता है और आप संभवतः ईमेल यदि कोई प्रक्रिया कांटे ही बहुत ज्यादा हो सकता है।

for i in `ps -A -o comm= --sort=+comm | uniq`; 
do 
    if ((`ps -C $i --no-headers | wc -l` > 10)); then 
     echo `hostname` $i `ps -C $i --no-headers | wc -l` ; 
    fi 
done 

अपनी चिंता की संख्या के साथ 10 बदलें।

TODO: "10" कमांड लाइन पैरामीटर के रूप में भी पारित किया जा सकता है। इसके अलावा, कुछ सिस्टम प्रक्रियाओं को अपवाद सूची में रखा जा सकता है।

2

उपर्युक्त में से कुछ मेरे लिए काम नहीं करते थे, लेकिन उन्होंने मुझे इस तरीके से मेरी मदद की।

ps aux | grep [j]ava -c 

लिनक्स के लिए newbies के लिए:

ps aux प्रिंट सभी वर्तमान में चल रहे प्रक्रियाओं, सभी प्रक्रियाओं है कि शब्द जावा, [] कोष्ठक प्रक्रिया तुम सिर्फ इसलिए भाग गया यह अभ्यस्त शामिल हटाने से मेल के लिए grep खोजें कि एक चल रही प्रक्रिया के रूप में और अंत में -c विकल्प गिनती के लिए खड़ा है।

3

आप कोशिश कर सकते हैं:

ps -ef | ग्रेप -cw [p]

या

ps aux rocess_name | ग्रेप -cw [p] rocess_name

जैसे:

ps -ef | ग्रेप -cw [i] nit

+0

मुझे यह समाधान कितना आसान और साफ करना पसंद है –

-1

मैं क्या यह अन्य distros पर है पता नहीं है, लेकिन Ubuntu पर, यह है:

nproc 

nproccoreutils का हिस्सा है। तो, यह अधिकांश लिनक्स distros पर उपलब्ध होना चाहिए।

1

सूची सभी प्रक्रिया के नाम, प्रकार और गिनती

ps --no-headers -A -o comm | sort | uniq -c 

तुम भी एक tty से जुड़ी प्रक्रिया

ps --no-headers a -o comm | sort | uniq -c 

आप फिल्टर कर सकते हैं सूचीबद्ध कर सकते हैं साथ:

ps --no-headers -A -o comm | awk '{ list[$1] ++ } END { for (i in list) { if (list[i] > 10) printf ("%20s: %s\n", i, list[i]) } }'