Üst komut çıkışını filtreleme


12

Bir Mac çalıştırıyorum ve topsadece PID, COMMAND ve% CPU sütunları görüntülenecek şekilde belirli bir işlem için komutun çıkışını filtrelemek istiyorum .

Sürecin PID'sini aldıktan sonra çalıştırıyorum:

top -pid 1234

Ancak, bu işlem için 15'ten fazla sütun görüntülenir. Awk komutunu çıktısını alabilir miyim ve sadece şunu görüntüleyebilir miyim:

PID COMMAND %CPU

kolonlar?

Çıktıyı bir metin dosyasında saklayıp daha sonra işlemek istemiyorum. Süreci gerçek zamanlı olarak izlemek istiyorum.

Yanıtlar:


8
top -pid 3907 -stats "pid,command,cpu"
  • -pid 3907: işlem kimliğiniz
  • -stats pid,command,cpu: yalnızca işlem kimliği, ad ve CPU% 'sini göster

awkÇıkışta çalışmaya gerek yok .


Çıktıyı sonradan işlemek istiyorsanız -l 0, günlük tutma modunda çalıştırmak için kullanın (0 süresiz olarak ifade edilir, diğer her şey örnek sayısını sınırlar). Çıktı şöyle görünecektir (iki tekrar):

Processes: 72 total, 3 running, 1 stuck, 68 sleeping, 326 threads 
2011/05/10 19:15:13
Load Avg: 0.14, 0.14, 0.09 
CPU usage: 20.0% user, 26.66% sys, 53.33% idle 
SharedLibs: 5304K resident, 5208K data, 0B linkedit.
MemRegions: 16345 total, 1048M resident, 54M private, 338M shared.
PhysMem: 726M wired, 1802M active, 687M inactive, 3215M used, 750M free.
VM: 169G vsize, 1036M framework vsize, 5261732(0) pageins, 552476(0) pageouts.
Networks: packets: 46747406/52G in, 32528901/3715M out.
Disks: 9452898/244G read, 11226269/293G written.

PID   COMMAND      %CPU
3907  WindowServer 0.0 
Processes: 72 total, 3 running, 1 stuck, 68 sleeping, 326 threads 
2011/05/10 19:15:14
Load Avg: 0.13, 0.14, 0.09 
CPU usage: 0.95% user, 1.90% sys, 97.14% idle 
SharedLibs: 5304K resident, 5208K data, 0B linkedit.
MemRegions: 16346 total, 906M resident, 54M private, 386M shared.
PhysMem: 726M wired, 1802M active, 687M inactive, 3215M used, 751M free.
VM: 169G vsize, 1036M framework vsize, 5261732(0) pageins, 552476(0) pageouts.
Networks: packets: 46747406/52G in, 32528901/3715M out.
Disks: 9452898/244G read, 11226269/293G written.

PID   COMMAND      %CPU
3907  WindowServer 2.7 

Kullanım awk(bu çizgiler bu örnekte değerleri içeren) ya da benzer bir alet sadece her 13. satırını göstermek için:

$ top -l 0 -pid 3907 -stats pid,command,cpu | awk 'NR%13==0'
3907  WindowServer 0.0 
3907  WindowServer 1.3 
3907  WindowServer 2.2 

# top -p1 -stats "pid,command,cpu" top: unknown option 't'
AstraSerg

@AstraSerg Benim için çalışıyor. Bunun topLinux'tan farklı bir Mac OS sorusu olduğunu unutmayın .
Daniel Beck

6

Bu kesinlikle yapılabilir ve bunu nasıl yapacağımı açıklayacağım. Bunun optimal bir yaklaşım olduğunu iddia etmiyorum, ama işi yapıyor. Linux (ve bash shell) kullanıyorum, bu yüzden üstümün varsayılan davranışı biraz farklı olabilir. Bu nedenle, bu senaryoyu kendi senaryosunuz için ayarlamanız gerekebilir.

  1. Sadece koşmak top herhangi bir argüman olmadan,:

    $ top

    İşte çıkışımdaki başlık ve ilgili satır:

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

    2569 user 20 0 339m 86m 10m S 7.8 6.9 6:42.99 java

    Bir süredir bellekte kalan ve aslında CPU tüketen bir süreç aldım, nihai hedefe ulaşmak için test süreci olarak kullanacağım.

  2. Varsayılan olarak üst, etkileşimli modda çalışır. Bu bana uymuyor, ilgili verileri yakalamak ve yazdırmak istiyorum. Bundan sonra verileri etkileşimli olarak görüntüleme görevini üstleneceğim. Üst sayfadaki alakalı alıntılar:

    -b: Toplu iş modu Çalışması En üste diğer programlara veya bir dosyaya çıktı göndermek için yararlı olabilecek 'Toplu modda' başlar. Bu modda üst, girişi kabul etmez ve '-n' komut satırı seçeneğiyle ayarladığınız yineleme sınırı olana kadar veya öldürülünceye kadar çalışır.

    -n: Yineleme sayısı şu şekilde sınırlandırılır: -n sayı Üstün sona ermeden önce üretmesi gereken maksimum yineleme veya çerçeve sayısını belirtir.

    Bu, çıktıyı yalnızca bir kez yazdıran ve sonra çıkan ayarlı üst komuttur:

    $ top -b -n 1

  3. İzlemek istediğim PID'yi biliyorum, bu yüzden üste bir kısıtlama daha ekleyeceğim, bu yüzden sadece bu işlemle ilgili verileri yazdırıyor:

    $ top -b -n 1 -p 2569

  4. Toplu modda bile, üst hala çalışma süresi, boş bellek / takas vb.Gibi çeşitli sistem çapında istatistikler içeren bir başlık yazdırır. Buna ihtiyacım yok. Tüm ihtiyacım sadece bir satır - benim süreç hakkında veri içeren bir, bu yüzden bu gibi tüm çıkış kesecek:

    $ top -b -n 1 -p 2569 | tail -n 2 | head -n 1

    Gördüğünüz gibi, 1'den ikinci satırı aldım.

  5. Ben sadece ihtiyacım olan sütunları ayıklamak için awk bu hattı boru olacak:

    $ top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

  6. Şimdiye kadar, bu manipülasyonları komut satırında yapıyorum, şimdi sabit kodlanmış özel durumumuza biraz kalıcılık ve esneklik ekleme zamanı. Tüm satırı basit bir kabuk betiğine taşıyorum. Ben 3top diyeceğim , daha sonra kullanılacak çünkü adı vurgulandı:

    #!/bin/bash

    top -b -n 1 -p 2569 | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

  7. PID numarası sabit kodlanmıştır, betiğin komut satırı argümanı olarak kabul etmesini sağlamak için:

    #!/bin/bash

    top -b -n 1 -p "$1" | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}'

    PID 2569 ile ilgili 3top görüntü istatistiklerini yapmak için buna şöyle çağrılmalıdır:

    $ ./3top 2569

  8. Ben de CPU yüklendikten sonra yüzde görüntülenmesini istiyorum, bu yüzden böyle benim 3top komut dosyası ayarlıyorum:

    #!/bin/bash

    out=$(top -b -n 1 -p "$1" | tail -n 2 | head -n 1 | awk '{print $1, $12, $9}')

    echo "$out%"

    Bir komut zincirinin tüm çıktısını (borularla bağlı) bir değişkene yönlendirdim. Sonra sadece echo kullanarak yazdırıyorum ve sonunda '%' ekliyorum, çünkü CPU yükü son alan

  9. Bu noktada, bir PID'yi bağımsız değişken olarak kabul eden ve istatistikleri bir kez yazdıran bir toplu iş komut dosyası var. Bunun yerine gerçek zamanlı izleme mi istiyorsunuz? Kolay, çünkü saat yapabilir! Komut dosyasını şu şekilde çalıştırın:

    $ watch -n 1 3top 2569

    Saniyede bir kez 3top çalıştırarak gerçek zamanlı izleme yapacaktır.


11
Kullanıcı OS X üzerinde ve Gnu yok top. geçersiz seçenek veya sözdizimi: -b . Bunun neden defalarca iptal edildiğine dair bir fikrim yok.
Daniel Beck

5
Gnu top(in procps), Homebrew, MacPorts veya Fink kullanılarak yüklenemez ve makeveya kullanılarak kaynaktan derlenemez cc top.c.
Daniel Beck

2

topGörüntüleme biçimi özelleştirilebilir, ancak komut satırında görüntüleme seçeneklerini belirtmek için bir yol yoktur. Bununla birlikte, yaratıcıysanız, ~/.toprcdosyayı akıllıca manipüle ederek muhtemelen ihtiyacınız olanı yapabilirsiniz .

Şunların görüntüsünü henüz özelleştirmediğinizi top(ve bir ~/.toprcdosyanız olmadığını ) varsayarsak :

  1. Başlat top.
  2. Basın falan seçim moduna girmek için.
  3. *Yanında istemediğiniz her alan için, ilgili alanın seçimini kaldırmak üzere ilgili harfe basın. Örneğin e, User Namealanın seçimini kaldırmak için düğmesine basın . İşiniz bittiğinde, sadece bir olmalıdır *yanında Process Id, CPU usageve Command name/line.
  4. SpaceAna pencereye dönmek için tuşuna basın .
  5. Geçerli düzeni dosyanıza kaydetmek için W(yani Shift+ w) tuşuna basın ~/.toprc.
  6. Çıkın top, ardından ayarlarınızın kaydedildiğini doğrulamak için yeniden başlatın.
  7. Varsayılan düzene geri dönmek istediğinizde, başlatmadan önce olduğu ~/.toprcgibi yeniden adlandırın . Eğer asgari düzenine geçmek istediğinizde, yeniden adlandırmak için geri başlatılması öncesinde .~/min.toprctop~/min.toprc~/.toprctop

Bu dosyayı yeniden adlandırma ve başlatma top, benden daha fazla deneyim ve bilgiye sahip biri tarafından basit bir kabuk betiğinde çalışılabilir. Düzenli topdüzeniniz zaten özelleştirildiyse özel olarak düşünmeniz gerekir .


Bir filtre (manuel olsa bile) eklemek mümkün müdür .toprc? Filtreyi RUID>999başlangıçta eklemeyi seviyorum .
Dr Beco
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.