Memfilter output perintah teratas

12

Saya menjalankan Mac dan ingin memfilter output dari topperintah untuk proses tertentu sehingga hanya kolom PID, COMMAND dan% CPU yang ditampilkan.

Setelah mendapatkan PID proses, saya menjalankan:

top -pid 1234

Namun ini menampilkan lebih dari 15 kolom untuk proses itu. Dapatkah saya mem-pipe output dari 'perintah ke awk dan hanya menampilkan:

PID COMMAND %CPU

kolom?

Saya tidak ingin menyimpan output dalam file teks dan kemudian memprosesnya. Saya tertarik memantau proses secara real time.

merokok
sumber

Jawaban:

8
top -pid 3907 -stats "pid,command,cpu"
  • -pid 3907: ID proses Anda
  • -stats pid,command,cpu: hanya tampilkan ID proses, nama, dan CPU%

Tidak perlu dijalankan awkpada output.


Jika Anda ingin memposting proses, gunakan -l 0untuk menjalankan dalam mode logging (0 berarti tanpa batas, segala sesuatu yang lain membatasi jumlah sampel). Output akan terlihat seperti ini (dua pengulangan):

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 

Gunakan awkatau alat serupa untuk hanya menampilkan setiap baris ke-13 (karena baris ini berisi nilai dalam contoh itu):

$ 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 
Daniel Beck
sumber
# top -p1 -stats "pid,command,cpu" top: unknown option 't'
AstraSerg
@AstraSerg Bekerja untuk saya. Perhatikan bahwa ini adalah pertanyaan Mac OS, yang memiliki perbedaan dengan topLinux.
Daniel Beck
6

Ini tentu saja dapat dilakukan dan saya akan menjelaskan bagaimana saya akan melakukannya. Saya tidak berpura-pura ini adalah pendekatan yang optimal, tetapi itu berhasil. Saya menggunakan Linux (dan bash shell), jadi perilaku default top saya mungkin sedikit berbeda. Jadi Anda mungkin perlu menyetel mini-howto ini untuk skenario khusus Anda.

  1. Jalankan saja teratas , tanpa argumen apa pun:

    $ top

    Berikut adalah tajuk dan baris yang relevan dari output saya:

    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

    Saya telah mengambil proses yang tetap dalam memori untuk beberapa waktu dan benar-benar mengkonsumsi CPU, saya akan menggunakannya sebagai proses pengujian untuk mencapai tujuan akhir.

  2. Secara default, top menjalankan dalam mode interaktif. Ini tidak cocok untuk saya, saya ingin mengambil data yang relevan dan mencetaknya. Saya akan menangani tugas menampilkan data secara interaktif setelah itu. Kutipan yang relevan dari halaman utama:

    -b: Operasi mode batch Mulai dari atas dalam 'Mode batch', yang dapat berguna untuk mengirim output dari atas ke program lain atau ke file. Dalam mode ini, atas tidak akan menerima input dan berjalan sampai batas iterasi yang telah Anda tentukan dengan opsi baris perintah '-n' atau sampai mati.

    -n: Jumlah batas iterasi sebagai: -n angka Menentukan jumlah maksimum iterasi, atau frame, atas harus menghasilkan sebelum berakhir.

    Ini adalah perintah teratas yang disesuaikan yang mencetak output hanya sekali, lalu keluar:

    $ top -b -n 1

  3. Saya tahu PID yang ingin saya tonton, jadi saya akan menambahkan satu batasan lagi ke atas, sehingga hanya mencetak data tentang proses itu:

    $ top -b -n 1 -p 2569

  4. Bahkan dalam mode batch, top masih mencetak header, yang berisi statistik seluruh sistem misc seperti uptime, free memory / swap dll. Saya tidak membutuhkan ini. Yang saya butuhkan hanya satu baris - baris yang berisi data tentang proses saya, jadi saya akan memotongnya dari seluruh output seperti ini:

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

    Seperti yang Anda lihat, saya mendapatkan baris kedua dari 1.

  5. Saya akan menyalurkan baris ini ke awk untuk mengekstrak hanya kolom yang saya butuhkan:

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

  6. Sampai sekarang, saya telah melakukan manipulasi ini di baris perintah, sekarang saatnya untuk menambahkan beberapa kegigihan dan fleksibilitas pada kasus khusus kami. Saya memindahkan seluruh baris menjadi skrip shell sederhana. Saya akan menyebutnya 3top , namanya ditekankan karena akan digunakan nanti:

    #!/bin/bash

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

  7. Nomor PID di-hardcode, berikut ini cara membuat skrip untuk menerimanya sebagai argumen baris perintah:

    #!/bin/bash

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

    Untuk membuat statistik tampilan 3top tentang PID 2569, harus dinamakan seperti ini:

    $ ./3top 2569

  8. Saya juga ingin persentase ditampilkan setelah memuat CPU, jadi saya menyetel skrip 3top saya seperti ini:

    #!/bin/bash

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

    echo "$out%"

    Saya telah mengalihkan seluruh output dari rantai perintah (terhubung melalui pipa) menjadi sebuah variabel. Lalu saya hanya mencetaknya menggunakan gema dan menambahkan '%' di akhir, karena beban CPU adalah bidang terakhir

  9. Pada titik ini saya memiliki skrip batch yang menerima PID sebagai argumen dan mencetak statistik satu kali. Ingin pemantauan waktu nyata saja? Mudah, karena jam tangan bisa melakukannya! Jalankan skrip seperti ini:

    $ watch -n 1 3top 2569

    Ini akan melakukan pemantauan real time dengan menjalankan 3top sekali per detik.

vtest
sumber
11
Pengguna berada di OS X dan tidak memiliki Gnu top. opsi atau sintaks yang tidak valid: -b . Tidak tahu mengapa ini berulang kali dibatalkan.
Daniel Beck
5
Gnu top(in procps) tidak dapat diinstal menggunakan Homebrew, MacPorts atau Fink dan tidak dapat dikompilasi dari sumber menggunakan salah satu makeatau cc top.c.
Daniel Beck
2

The topformat tampilan dapat disesuaikan, tetapi tidak ada cara untuk menentukan pilihan tampilan pada baris perintah. Namun, jika Anda inventif, Anda mungkin dapat melakukan apa yang Anda butuhkan dengan memanipulasi ~/.toprcfile secara cerdik .

Dengan asumsi Anda belum menyesuaikan tampilan top(dan tidak memiliki ~/.toprcfile):

  1. Luncurkan top.
  2. Tekan funtuk masuk ke mode pilih bidang.
  3. Untuk setiap bidang yang memiliki di *sebelahnya yang tidak Anda inginkan, tekan huruf yang sesuai untuk membatalkan pilihan bidang itu. Misalnya, tekan euntuk membatalkan pilihan User Namebidang. Ketika Anda selesai, Anda hanya harus memiliki *sebelah Process Id, CPU usage, dan Command name/line.
  4. Tekan Spaceuntuk kembali ke jendela utama.
  5. Tekan W(yaitu Shift+ w) untuk menyimpan tata letak saat ini ke ~/.toprcfile Anda .
  6. Keluar top, lalu luncurkan ulang untuk memverifikasi bahwa pengaturan Anda disimpan.
  7. Saat Anda ingin kembali ke tata letak default, ubah nama ~/.toprcmenjadi sesuatu seperti ~/min.toprcsebelum meluncurkan top. Saat Anda ingin beralih ke tata letak minimal, ganti nama ~/min.toprckembali ~/.toprcsebelum meluncurkan top.

Pengubahan nama dan peluncuran file ini topmungkin dapat dikerjakan menjadi skrip shell sederhana oleh seseorang yang memiliki lebih banyak pengalaman dan pengetahuan daripada saya. Anda akan memerlukan pertimbangan khusus jika toptata letak reguler Anda telah disesuaikan.

William Jackson
sumber
Apakah mungkin menambahkan filter (walaupun secara manual) .toprc? Saya suka menambahkan filter RUID>999saat startup.
Dr Beco