TOP komutunun çıktısını belirli bir işlem adıyla sınırlayın


81

En üstteki komutu çağırırsanız, çalışan tüm işlemleri alırsınız. Ancak çıktıyı yalnızca "java" gibi belirli bir işlem adıyla nasıl sınırlayabilirim ?

Bu en iyi -l 2'yi denedim | grep java, ancak bu şekilde yalnızca anlık görüntüler elde edersiniz ve sürekli güncellenen bir liste almazsınız. Ve üst -l 0 | grep java gerçekten net değil.


5
Maalesef şu ana kadar hala geçerli bir yanıt yoktur, çünkü -p & -b OS X'in üst komutu tarafından desteklenmemektedir .
Alex

Aşağıda belki de ilk OSX çözümünün ne olduğunu yayınladım - ve tam zamanında;)
Anti Earth

Yanıtlar:


131

Aşağıdakileri tercih ederim, böylece her çalıştırdığımda pidlere bakmak zorunda kalmadan yine de etkileşimli olarak top kullanabilirim:

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

Tabii ki süreçler değişirse, komutu yeniden çalıştırmanız gerekir.

Açıklama:

  • pgrep process-name satırsonu ile ayrılmış süreç kimlikleri listesi döndürür
  • tr "\\n" "," bu satırsonlarını virgüllere çevirir, çünkü top virgülle ayrılmış bir süreç kimlikleri listesi ister
  • sedbir akış düzenleyicidir ve sed 's/,$//'burada sondaki virgülü kaldırmak için kullanılır

2
En iyi cevap, dogbane'leri iyileştirir, böylece çok sayıda PID yapıştırmak yerine adı gerçekten yazabilirsiniz. (Ve bu SO)
sabgenton

1
Yapabilseydim, size birden çok kez oy verirdim, bence bu gerçekten "kabul edilen" cevap olmalı.
spuriousdata

6
Alıyorum top: pid limit (20) exceeded. Bu sınırın etrafında bir şekilde var mı?
celwell

7
@celwell, lütfen dene top -p $(pgrep process-name | head -20 | tr "\\n" "," | sed 's/,$//'). Bu, tarafından döndürülen ilk 20 PID'ye kadar olan verileri gösterecektir pgrep.
Acumenus

3
Yosemite (veya daha önce mi?) İtibariyle -pidbunun yerine -p.
en fazla

53

İzlemek istediğiniz işlemlerin pid'lerini bulun ve ardından -ppidlerin bir listesini vermenizi sağlayan seçeneği kullanın.top komuta bir kullanın.

Misal:

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

(Ayrıca virgülle ayrılmış bir liste de geçirebileceğinize inanıyorum.)


7
Mac'te "top -pid ID" olmalıdır, ancak birkaç java işlemi olabileceğinden Java işleminin birkaç farklı kimliği olabilir.
Alex

32

peki ya top -b | grep java


1
Mac'te çalışmıyor çünkü Mac, GPL araçlarını değil BSD araçlarını kullanıyor. Ve bazı farklılıklar var. Sanırım "-b" versiyonu "-l 0" 'a benziyor ama aynı zamanda tablonun başlığı da yazdırılıyor?
Alex

29

@ Dogbane'nin cevabını genişleterek pgrep, aşağıdakileri yapmak için adlandırılmış bir işlem için tüm PID'leri alabilirsiniz :

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

2
Bunun maksimum sınırı 20 pids
mrP

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

Haklısın! man top"Bu seçenek 20 defaya kadar verilebilir veya 20 pid'e kadar virgülle ayrılmış bir liste sağlayabilirsiniz." Dang.
l0b0

6

İzle komutunu kullanın

watch -d 'top -n1 | grep mysql'

"İzle --d" olmalıdır. Ancak bu komutu yürütürken hiçbir çıktı alamıyorum.
Alex

-1:: man watch" watch komutu tekrar tekrar çalıştırır, çıktısını ve hatalarını gösterir "; şu anda topyaptığı gibi çalışan işlemleri göstermiyor
sdaau

@AlexanderOrlov, burada özel bir sihir yok, basmak ve çıkmak için sadece top -n1'i kullanın ve onu sürekli izlemek için saati kullanın.
tszming

@sdaau, yorumunuz cevabımla alakasız, lütfen bir dahaki sefere daha dikkatli cevap verin.
tszming

1
-B seçeneklerini eklememiz gerektiğini düşünüyorum. watch -d 'top -b -n1 | grep mysql'
Reyes Yang

6

Buradan gelen cevabı kullanarak tek bir satır oluşturabildim

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

Bu benim için MacOS 10.12'de (Sierra) çalışıyor


2

Sorunumu kullanarak çözdüm:

üst -n1 -b | grep "işlem adı"

bu durumda: -n, hangi işlemin kaç kez top olacağını ayarlamak
için kullanılır ve -b tüm pid'leri göstermek için kullanılır.

top: pid sınırı (20) aşıldı gibi hataları önler


2

Aşağıdaki kod, watch komutu aracılığıyla her 5 saniyede bir işlemlerin listesini günceller:

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



1

Diyelim ki .. sunucuda aynı adla çalışan 20'den fazla işlemimiz varsa ... bu yardımcı olmaz

en iyi p pgrep oracle | head -n 20 | tr "\\n" "," | sed 's/,$//'

Daha fazla kaynak tüketen diğer prosedürleri kaçırma şansımızın yüksek olduğu 20 işlemin gerçek zamanlı çıktısını listelemeye ve sağlamaya çalışacaktır ...

Hala bu konuda daha iyi bir seçenek arıyorum


0

Aslında aradığım gibi daha spesifik bir durum:

İçin Java işler de kullanabilirsiniz jps -qsayede jps bir araçtır $ java_home / bin $ PATH içinde olmalıdır dolayısıyla ve.


0

Buraya OSX'te bunun cevabını aramaya geldim. Bash ve awk ile istediğimi elde ettim:

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
}

Günlüğe kaydetme modunda top döngüsüne giriyorum ve awk ile filtreleyerek pgrep çıktısından ilişkilendirilebilir bir dizi oluşturuyorum. Awk, 12. satırın sütun başlıkları olduğu ilk 12 satırı ve ardından dizide anahtar olan bir pid içeren her satırı yazdırır. Döküm dosyası, daha izlenebilir bir döngü için kullanılır.


OSX'te pgrep <process_name> gibi bir şey kullanabilirsiniz; top -pid <pid_specified_by_pgrep>
bergercookie

0

sadece top -bn 1 | grep javasenin için hile yapacağım


0

Aşağıdakileri çalıştırmak konsolda sürekli güncelleme sağlayacaktır:

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

İşte sadece MacOS için şu ana kadar çözüm:

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

ancak bu, canlı işlem invalid option or syntax: -pidyoksa istenmeyen şekilde rapor edecektir java.

AÇIKLAMA

Burada yayınlanan diğer çözümler biçimi kullanır top -p id1,id2,id3, ancak MacOS ' topyalnızca beceriksiz biçimi destekler top -pid id1 -pid id2 -pid id3.

İlk olarak, "java" işlem adına sahip işlem kimliklerinin listesini elde ederiz:

pgrep java

ve awksonuçları ayırıcı ile birleştiren bunu yönlendiriyoruz" -pid "

| awk 'ORS=" -pid "'

Ne yazık ki, bu geride bir sınırlayıcı bırakıyor! Örneğin, şimdiye kadar dizeyi elde etmiş olabiliriz"123 -pid 456 -pid 789 -pid " .

Daha sonra sedsınırlayıcının son 6 karakterini tıraş etmek için kullanırız.

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

Sonuçları şunlara iletmeye hazırız top:

top -pid `...`

0

süreci takip edin:

# pidof <process>

hangi işlem pidlerinin görüntüleneceğini söyle

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

misal:

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

Top sadece 2 'konsol' sürecini gösterecektir. Bu, grep aracılığıyla yönlendirmeye gerek kalmadan, ssh aracılığıyla meşgul bir sunucuda kullanışlıdır.


üzgünüm, söz konusu macos etiketini görmedim. benimki tüm linux kutularımda çalışıyor.
Landis Reed

-1

Rick Byers'ın yanıtında belirtilen yaklaşımı kullanarak:

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

ancak çalışan 20'den fazla işlemim vardı, bu nedenle aşağıdaki komut benzer bir durumla karşılaşan biri için yararlı olabilir.

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

pgrepverilen ada sahip işlemlerin listesini alır - bu durumda java. headilk 20 pid'i elde etmek için kullanılır çünkü top, -p argümanını kullanırken 20'den fazla pid'i işleyemez. Son olarak pastepids listesine ',' ile katılır.

Yukarıdaki komutta aradığınız işlem adını ve izlemek istediğiniz o isimdeki işlem sayısını kontrol edebilirsiniz. head -n 20Verilen isimdeki işlem sayınız 20'den az ise parçayı göz ardı edebilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.