TOP कमांड के आउटपुट को एक विशिष्ट प्रोसेस नाम तक सीमित करें


81

यदि आप शीर्ष कमांड को कॉल करते हैं, तो आपको सभी रनिंग प्रोसेस मिलते हैं। लेकिन मैं केवल "जावा" जैसे एक निश्चित प्रक्रिया के नाम पर आउटपुट को कैसे सीमित कर सकता हूं ?

मैंने इस शीर्ष -l 2 की कोशिश की है | grep जावा लेकिन इस तरह से आपको केवल स्नैपशॉट मिलते हैं न कि लगातार अपडेट की जाने वाली सूची। और शीर्ष-एल 0 | grep जावा वास्तव में स्पष्ट नहीं है।


5
दुर्भाग्य से अभी तक वहाँ कोई वैध जवाब नहीं है क्योंकि -p और -b OS X के शीर्ष कमांड द्वारा समर्थित नहीं हैं ।
एलेक्स

मैंने पोस्ट किया है कि शायद नीचे पहला OSX समाधान क्या है - और बस समय के निक में?)
एंटी पृथ्वी

जवाबों:


131

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

top -p `pgrep process-name | tr "\\n" "," | sed 's/,$//'`

बेशक अगर प्रक्रियाएं बदल जाती हैं तो आपको कमांड को फिर से चलाना होगा।

स्पष्टीकरण:

  • pgrep process-name प्रक्रिया आईडी की सूची लौटाता है, जिसे नए सिरे से अलग किया जाता है
  • tr "\\n" "," इन न्यूलाइन्स का अल्पविराम में अनुवाद करता है, क्योंकि शीर्ष प्रक्रिया आईडी की अल्पविराम से अलग सूची चाहता है
  • sedएक स्ट्रीम संपादक है, और sed 's/,$//'इसका उपयोग यहां आने वाले कॉमा को हटाने के लिए किया जाता है

2
सर्वश्रेष्ठ उत्तर, डॉगबैन पर सुधार करता है ताकि आप बहुत सारे पीआईडी ​​चिपकाने के बजाय वास्तविक प्रकार का नाम रख सकें। (और यह एसओ है)
सबजेंटन

1
मैं आपको कई बार वोट दूंगा अगर मैं कर सकता हूं, तो यह वास्तव में "स्वीकृत" उत्तर होना चाहिए, मुझे लगता है।
स्फुरदत्त

6
मुझे मिल रहा है top: pid limit (20) exceeded। क्या उस सीमा के आसपास भी ऐसा है?
celwell

7
@ लेवेल, कृपया प्रयास करें top -p $(pgrep process-name | head -20 | tr "\\n" "," | sed 's/,$//')। इसके द्वारा लौटाए गए पहले 20 PID तक के डेटा दिखाए जाएंगे pgrep
एक्यूमेनस

3
Yosemite के रूप में (या पहले?) इसके -pidबजाय है -p
अधिकतम

53

जिन प्रक्रियाओं को आप मॉनिटर करना चाहते हैं, उनके ग्रिड का पता लगाएं और फिर उस -pविकल्प का उपयोग करें जो आपको pids की सूची प्रदान करने की अनुमति देता हैtop कमांड ।

उदाहरण:

top -p 18884 -p 18892 -p 18919

  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME CPU COMMAND
18884 user  25   0  672M  95M  9476 S     0.0  1.1   0:02   1 java
18892 user  25   0 2280M 123M 12252 S     0.0  1.5   0:05   1 java
18919 user  22   0 1492M 198M 28708 S     0.0  2.4   0:07   1 java

(मेरा मानना ​​है कि आप अल्पविराम से अलग की गई सूची में भी पास हो सकते हैं।)


7
मैक पर यह "टॉप-आईडी आईडी" होना चाहिए लेकिन जावा प्रक्रिया में कई अलग-अलग आईडी हो सकते हैं क्योंकि कई जावा प्रक्रियाएं हो सकती हैं।
एलेक्स

32

कैसे शीर्ष के बारे में -b | ग्रेप जावा


1
मैक पर काम नहीं करता क्योंकि मैक बीएसडी टूल्स का उपयोग करता है न कि जीपीएल टूल्स का। और कुछ अंतर हैं। मुझे लगता है कि "-b" संस्करण "-l 0" के समान है, लेकिन तालिका का हेडर भी मुद्रित है?
एलेक्स

29

@ Dogbane के उत्तर पर विस्तार करते हुए , आप pgrepनिम्नलिखित प्रक्रिया को करने के लिए एक नामित प्रक्रिया के लिए सभी पीआईडी ​​प्राप्त कर सकते हैं :

top -p "$(pgrep -d ',' java)"

2
यह 20 pids की अधिकतम सीमा है
mrP

top -p "$(pgrep -d ',' php)" top: pid limit (20) exceeded
21

आप सही हे! man topकहते हैं, "यह विकल्प 20 बार तक दिया जा सकता है, या आप 20 तक के साथ अल्पविराम वाली सूची प्रदान कर सकते हैं।" खैर खतरा है।
l0b0

6

वॉच कमांड का उपयोग करें

watch -d 'top -n1 | grep mysql'

"वॉच - डी" होना चाहिए। हालाँकि मुझे इस कमांड को निष्पादित करने वाला कोई आउटपुट नहीं मिला है।
एलेक्स

-1:: man watch" वॉच रन कमांड बार-बार, अपने आउटपुट और त्रुटियों को प्रदर्शित करता है "; यह वर्तमान में चल रहे प्रक्रियाओं प्रदर्शित नहीं करता है की तरह topकरता है
sdaau

@AlexanderOrlov, यहां कोई विशेष जादू नहीं है, बस प्रिंट और बाहर निकलने के लिए टॉप -n1 का उपयोग करें, और लगातार निगरानी करने के लिए घड़ी का उपयोग करें।
tszming 9

@sdaau, आपकी टिप्पणी मेरे उत्तर के लिए अप्रासंगिक है, कृपया अगली बार अधिक ध्यान से उत्तर दें।
tszming 9

1
मुझे लगता है कि हमें -b विकल्प जोड़ना चाहिए। watch -d 'top -b -n1 | grep mysql'
रेयेस यांग

6

यहाँ से उत्तर का उपयोग करके मैं एक लाइनर बनाने में सक्षम था

top -pid $(pgrep process_name | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ -pid /g')

यह MacOS 10.12 (सिएरा) पर मेरे लिए काम करता है


2

मैंने अपनी समस्या हल कर ली है:

शीर्ष -n1 -b | grep "सफल नाम"

इस स्थिति में: -n का उपयोग यह सेट करने के
लिए किया जाता है कि सभी pids को दिखाने के लिए कितनी बार शीर्ष और -b का उपयोग किया जाता है

यह त्रुटियों को रोकता है जैसे: शीर्ष: पीआईडी ​​सीमा (20) पार हो गई


2

निम्न कोड वॉच कमांड के माध्यम से हर 5 सेकंड में प्रक्रियाओं की एक सूची अपडेट करता है:

watch -n 5 -t top -b -n 1 -p$(pgrep java | head -20 | tr "\\n" "," | sed 's/,$//')



1

मान लीजिए .. अगर हमारे पास सर्वर पर एक ही नाम से 20 से अधिक प्रोसेस चल रहे हैं ... तो इससे कोई फायदा नहीं होगा

शीर्ष-पी pgrep oracle | head -n 20 | tr "\\n" "," | sed 's/,$//'

यह 20 प्रक्रिया की वास्तविक समय आउटपुट को सूचीबद्ध करने और प्रदान करने की कोशिश करेगा जहां हमारे पास अन्य रियायतों को याद करने का अच्छा मौका है जो अधिक संसाधन का उपभोग करता है ...।

मैं अभी भी इस पर बेहतर विकल्प की तलाश में हूं


0

एक अधिक विशिष्ट मामला, जैसे मैं वास्तव में देख रहा था:

के लिए जावा प्रक्रियाओं आप भी उपयोग कर सकते हैं jps -qजिससे JPS से एक उपकरण है $ JAVA_HOME / bin और इसलिए अपने $ पथ में होना चाहिए।


0

मैं OSX पर इसका जवाब ढूंढने के लिए यहां आया था। मैं बैश और जाग के साथ जो चाहता था उसे प्राप्त कर रहा हूं:

topfiltered() {
  [[ -z "$1" ]] && return
  dump="/tmp/top_dump"
  rm -f "$dump"
  while :; do
    clear
    [[ -s "$dump" ]] && head -n $(( $LINES - 1 )) "$dump"
    top -l 1 -o cpu -ncols $(( $COLUMNS / 8 )) | awk -v p="$(pgrep -d ' ' $@)" '
        BEGIN { split(p, arr); for (k in arr) pids[arr[k]]=1 }
        NR<=12 || ($1 in pids)
    ' >"$dump"
  done
}

मैं लॉगिंग मोड में शीर्ष पर हूं और इसे awk के साथ फ़िल्टर करता हूं, pgrep के आउटपुट से एक साहचर्य सरणी का निर्माण करता हूं। अक्क पहले 12 लाइनों को प्रिंट करता है, जहां लाइन 12 कॉलम हेडर है, और फिर हर पंक्ति जिसमें एक पिड है जो सरणी में एक कुंजी है। डंप फ़ाइल का उपयोग अधिक वाष्पशील लूप के लिए किया जाता है।


OSX पर आप pgrep <process_name> जैसी किसी चीज़ का उपयोग कर सकते हैं; टॉप -पिड <pid_specified_by_pgrep>
bergercookie


0

नीचे चलने से कंसोल में निरंतर अपडेट मिलेगा:

bcsmc2rtese001 [~]$ echo $SHELL  
/bin/bash  
bcsmc2rtese001 [~]$ top | grep efare  or watch -d 'top | grep efare' or top -p pid
27728 efare     15   0 75184 3180 1124 S  0.3  0.0 728:28.93 tclsh  
27728 efare     15   0 75184 3180 1124 S  0.7  0.0 728:28.95 tclsh

0

यहाँ MacOS के लिए अब तक एकमात्र समाधान है:

top -pid `pgrep java | awk 'ORS=" -pid "' | sed 's/.\{6\}$//'`

हालांकि यह अवांछनीय रूप से रिपोर्ट करेगा invalid option or syntax: -pidकि क्या कोई javaप्रक्रिया जीवित नहीं है।

व्याख्या

यहां पोस्ट किए गए अन्य समाधान प्रारूप का उपयोग करते हैं top -p id1,id2,id3, लेकिन MacOS ' topकेवल undieldy प्रारूप का समर्थन करता है top -pid id1 -pid id2 -pid id3

तो सबसे पहले, हम प्रोसेस आईडी की सूची प्राप्त करते हैं जिसका प्रोसेस नाम "जावा" है:

pgrep java

और हम इसे पाइप करते हैं awkजो परिसीमनक के साथ परिणामों में शामिल होता है" -pid "

| awk 'ORS=" -pid "'

काश, यह एक अनुगामी परिसीमन छोड़ देता है! उदाहरण के लिए, हम अब तक स्ट्रिंग प्राप्त कर सकते हैं"123 -pid 456 -pid 789 -pid "

हम तो sedसीमांकक के अंतिम 6 पात्रों को दाढ़ी बनाने के लिए उपयोग करते हैं ।

| sed 's/.\{6\}$//'`

हम परिणामों को पास करने के लिए तैयार हैं top:

top -pid `...`

0

प्रक्रिया से मुक्त हो जाओ:

# pidof <process>

शीर्ष बताएं कि प्रदर्शन करने के लिए क्या प्रक्रिया है

# top -p <pid1>,<pid2>, etc

उदाहरण:

landis@linux-e6510:~>pidof konsole
1841 1709
landis@linux-e6510:~>top -p 1841,1709

शीर्ष केवल 2 'konsole' प्रक्रियाओं को प्रदर्शित करेगा। यह ssh के माध्यम से एक व्यस्त सर्वर पर उपयोगी है, थ्रू grep को पाइप करने के लिए नहीं।


क्षमा करें, प्रश्न के तहत मैकोस टैग नहीं देखा। मेरा सभी लिनक्स बॉक्स पर काम करता है।
लैंडिस ने

-1

रिक बायर्स द्वारा उत्तर में वर्णित दृष्टिकोण का उपयोग करना:

top -p `pgrep java | paste -sd "," -`

लेकिन मेरे पास 20 से अधिक प्रक्रियाएं चल रही थीं, इसलिए निम्नलिखित कमांड किसी ऐसे व्यक्ति के लिए मददगार हो सकती है, जो एक समान स्थिति का सामना करता हो।

top -p `pgrep java | head -n 20 | paste -sd "," -`

pgrepइस मामले में दिए गए नाम - जावा के साथ प्रक्रियाओं की सूची मिलती है। head-प तर्क का उपयोग करते समय पहले 20 pids प्राप्त करने के लिए उपयोग किया जाता है क्योंकि शीर्ष 20 pids से अधिक नहीं संभाल सकता है। आखिरकारpaste में ',' के साथ pids की सूची शामिल हो जाता है।

आप उपरोक्त कमांड में देख रहे प्रक्रिया नाम को नियंत्रित कर सकते हैं और उस नाम के साथ प्रक्रियाओं की संख्या जिसे आप देखना चाहते हैं। यदि आप head -n 20दिए गए नाम के साथ आपकी प्रक्रियाओं की संख्या 20 से कम है, तो आप इस भाग को अनदेखा कर सकते हैं ।

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