işlem adına göre listelenen işlemleri filtrelemek için linux'ta top -c komutu


154
top -c

Tüm işlemleri üstte listeler, -u seçeneğini kullanarak işlemleri kullanıcı adına göre filtrelemek için iyi seçenekler vardır, ancak üst çıktının KOMUT sütunu altında listelenen işlem adına dayalı olarak işlemleri filtrelemenin kolay bir yolu olup olmadığını merak ediyorum.

Örneğin, top -some seçenek -bir işlem adının alt dizesini ve üst dizgeyi sadece komut adında bu alt dizeye sahip olan pid'leri görüntüler.

Yanıtlar:


222

Eşleşen komut satırlarının pid'lerini almak için pgrep kullanma:

top -c -p $(pgrep -d',' -f string_to_match_in_cmd_line)

top -pvirgülle ayrılmış bir pid listesi beklediğinden -d',', pgrep'te kullanıyoruz. -fPgrep bayrak yerine programın adının komut satırını maç yapar.


12
sadece 'string_to_match_in_cmd_line' için yeni süreçler ortaya çıkarsa, bunların üstte görünmeyeceklerini unutmayın;
top'dan

1
Eugenevd'in dediği gibi, bu, top çağrıldıktan sonra başlayan yeni süreçler için işe yaramayacaktır. Bunu yapmanın bir yolu var mı? Adında aynı ön eke sahip birkaç program çalıştırmam gerekiyor ve bunların kaçının canlı bir şekilde çalıştığını görmek isterim, her seferinde yeni bir üst (veya sadece bir ps) çalıştırmaya gerek yok.
Jester

1
@ Jester, eugenevd, seninle aynı problemi yaşadım. Stackoverflow.com/a/27653841/681830 adresinde yeni bir sürüm hazırladım , umarım yardımcı olur.
Val

5
Karşılaştığım top: pid limit (20) exceededbunu kullandım böylece: top -c -p $(pgrep -f string_to_match_in_cmd_line | head -20 | tr "\\n" "," | sed 's/,$//').
f01

123

Etkileşimli olarak yapılabilir

Çalıştırdıktan sonra , bir sütuna bir filtre top -cvurun ove yazın, örneğin COMMAND sütununun foo dizesini içerdiği satırları göstermek için, yazınCOMMAND=foo

Sadece bazı temel çıktılar istiyorsanız, bu yeterli olabilir:

top -bc |grep name_of_process

7
Bu bana 'geçersiz seçenek veya sözdizimi: -bc'
veriyor

3
top -bc -n 1 yineleme sayısını 1 ile sınırladığı için daha kullanışlıdır.
galath

1
Kabul edilen cevap bu olmalıdır. Daha doğru ve sadece 'top' komutunun sağladığı seçeneklerle çalışıyor. Ve yeni süreçler gösteriyor.
Abraham TS

Süreçler kaybolmaya ve yeniden ortaya çıkmaya devam ediyor top -c , hit o and write a filter on a column.
MrR

94

topÇalışırken filtreler ekleyebilirsiniz , sadece tuşuna basın ove ardından bir filtre ifadesi yazın. Örneğin, tüm java işlemlerini izlemek için filtre ifadesini kullanın COMMAND=java. Tuşa tekrar basarak birden fazla filtre ekleyebilir, tuşu ile kullanıcıya göre filtre uygulayabilir, utuşu ile tüm filtreleri temizleyebilirsiniz =.


2
Bu, kabul edilen cevaptan daha iyi bir çözümdür (bu çözüm orijinalinden 3 yıl sonra ortaya çıkmıştır). Orijinalin aksine, bu çözüm aslında yeni ortaya çıkan süreçler üzerinde de çalışıyor. İsteğe bağlı olarak oluşturulan Apache işlemlerini izliyorsanız çok önemlidir.
Nate Lampton

2
Gerçekten daha iyi bir çözüm çünkü canlı filtreler. Kabul edilen çözüm, top çalıştırmadan önce işlem kimliklerini çözer. Ortaya çıkan süreç, top -c -p 920,1345,1346sabitlenmiş gibidir.
Jérôme Gillard

4
Kullanılması ofiltre olarak üst bazılarının (eski) sürümlerinde yok: top: procps version 3.2.8Kullanıcı filtresi var, o çalışır böylece.
Manwe

13

@ perreal'ın komutu harika çalışıyor! Unutursanız iki adımda deneyin ...

örnek: yalnızca yakuake adlı uygulamayı görüntülemek için üste filtre uygulayın:

$ pgrep yakuake
1755

$ top -p 1755

kullanışlı üst etkileşimli komutlar 'c': tam yolu değiştir komut adı 'k': PID'ye göre öldür 'F': filtre ... oklarla seçin ... ardından sıralamayı ayarlamak için 's' tuşuna basın

aşağıdaki cevap da güzel ... Bugün arıyordum ama bulamadım. Teşekkürler


7

StackOverflow'da bu kadar çok cevap aradıktan sonra, ihtiyaçlarıma uygun bir cevap görmedim.

Yani, verilen anahtar kelimeyle yenilemeye devam etmek için top komutunu yapmak ve yeni süreçler ortaya çıktığında tekrar tekrar CTRL + C / top yapmak zorunda değiliz.

Böylece yenisini yaparım ...

Yeniden başlatma gerektirmeyen sürüm burada.

__keyword=name_of_process; (while :; do __arg=$(pgrep -d',' -f $__keyword); if [ -z "$__arg" ]; then top -u 65536 -n 1; else top -c -n 1 -p $__arg; fi; sleep 1; done;)

__Anahtar kelimeyi değiştirin ve çalışmalıdır. (Ubuntu 2.6.38 test edildi)

2.14.2015 eklendi: Yukarıdaki kodda sistem iş yükü bölümü eksik. "Yük ortalaması" kısmını önemseyen kişiler için:

__keyword=name_of_process; (while :; do __arg=$(pgrep -d',' -f $__keyword); if [ -z "$__arg" ]; then top -u 65536 -n 1; else top -c -n 1 -p $__arg; fi; uptime; sleep 1; done;)

bu, sistemin iş yüküyle ilgili bir genel bakış eksik. uykudan önce "çalışma süresi" ekleyin, kısa işlem listeleri için bu yeterli IMHO'dur.
Sevyls

1
@Sevyls İşaret ettiğiniz için teşekkürler! Diğer birkaç denemeden sonra (bu kadar iyi çalışmayan) sürümünüz en iyilerden biri olabilir. Cevap değiştirildi.
Val

Bu eşleşmeyi çalıştıran bir veya daha fazla işlemim varsa harika çalışıyor, ancak tümü durduğunda "en iyi: Geçersiz kullanıcı" alıyorum. Başka bir işlem başladığında iyileşir. Raspbian FYI'de koşuyorum. Teşekkürler.
Mike

3

İçinde htop, basitçe arama yapabilirsiniz

/process-name

1

Peki buna ne dersin?

top -c -p <PID>

4
işlem adına (veya alt dizesine) göre filtrelemeye çalışıyoruz ve işleminizi yeniden başlattığınızda yeni bir pid alacaksınız.
Srujan Kumar Gulla

1

Aşağıdaki kodla bir kabuk komut dosyası kullandım:

#!/bin/bash

while [ 1 == 1 ]
do
    clear
    ps auxf |grep -ve "grep" |grep -E "MSG[^\ ]*" --color=auto
    sleep 5
done

1

İşlem listesi 20 işlemi aştığında yanıtların çoğu burada başarısız olur. Bu top -pseçenek sınırıdır. oSeçeneklerle filtrelemeyi desteklemeyen daha eski topa sahip olanlar için, tam ekran / konsol çıkışı elde etmek için komut dosyası yapılabilir bir örnek burada verilmiştir (bu çıktıda özet bilgi eksiktir).

__keyword="YOUR_FILTER" ; ( FILL=""; for i in  $( seq 1 $(stty size|cut -f1 -d" ")); do FILL=$'\n'$FILL; done ;  while :; do HSIZE=$(( $(stty size|cut -f1 -d" ")  - 1 ));  (top -bcn1 | grep "$__keyword"; echo "$FILL" )|head -n$HSIZE; sleep 1;done )

Bazı açıklamalar

__keyword = your grep filter keyword
HSIZE=console height
FILL=new lines to fill the screen if list is shorter than console height
top -bcn1 = batch, full commandline, repeat once
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.