perintah top -c di linux untuk memfilter proses yang terdaftar berdasarkan processname


149
top -c

Atas daftar semua proses, ada opsi yang baik untuk memfilter proses dengan nama pengguna dengan menggunakan opsi -u tapi saya bertanya-tanya apakah ada cara mudah untuk menyaring proses berdasarkan nama proses yang tercantum di bawah kolom PERINTAH dari output teratas.

Sebagai contoh saya ingin seperti opsi top -some -substring dari processname dan menampilkan top pids hanya memiliki substring ini dalam nama perintahnya

Jawaban:


214

Menggunakan pgrep untuk mendapatkan pid dari baris perintah yang cocok:

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

top -pmengharapkan daftar pai yang dipisahkan koma sehingga kami gunakan -d','di pgrep. The -fbendera di pgrep membuatnya cocok dengan baris perintah, bukan nama program.


12
hanya ingat bahwa jika proses baru muncul untuk 'string_to_match_in_cmd_line' mereka tidak akan muncul di atas; Anda harus berhenti dari atas dan menjalankan kembali perintah ini
eugenevd

1
Seperti yang dikatakan eugenevd, ini tidak akan berfungsi untuk proses baru yang dimulai setelah bagian atas dipanggil. Apakah ada cara untuk melakukannya? Saya perlu menjalankan beberapa program dengan awalan yang sama pada namanya, dan saya ingin melihat berapa banyak dari mereka berjalan secara langsung, tidak perlu mengeksekusi top baru (atau hanya ps) setiap kali.
Jester

1
@Jester, eugenevd, saya punya masalah yang sama seperti yang Anda lakukan. Saya membuat versi baru di stackoverflow.com/a/27653841/681830 , semoga bisa membantu.
Val

5
Saya temui top: pid limit (20) exceededjadi saya menggunakan ini: top -c -p $(pgrep -f string_to_match_in_cmd_line | head -20 | tr "\\n" "," | sed 's/,$//').
f01

115

Itu bisa dilakukan secara interaktif

Setelah berjalan top -c, tekan odan tulis filter pada kolom, mis. Untuk menunjukkan baris di mana kolom PERINTAH berisi string foo, tulisCOMMAND=foo

Jika Anda hanya ingin beberapa output dasar, ini mungkin cukup:

top -bc |grep name_of_process

7
Ini memberi saya 'opsi atau sintaks yang tidak valid: -bc'
shmim

3
top -bc -n 1 lebih nyaman, karena membatasi jumlah iterasi ke 1.
galath

1
Ini harus menjadi jawaban yang diterima. Ini lebih akurat dan berfungsi hanya dengan opsi yang disediakan oleh perintah 'top'. Dan itu memang menunjukkan proses baru.
Abraham TS

Proses terus menghilang dan muncul kembali dengan top -c , hit o and write a filter on a column.
MrR

92

Anda dapat menambahkan filter topsaat sedang berjalan, cukup tekan otombol lalu ketik ekspresi filter. Misalnya, untuk memantau semua proses java gunakan ekspresi filter COMMAND=java. Anda dapat menambahkan beberapa filter dengan menekan tombol lagi, Anda dapat memfilter menurut pengguna dengan ukunci, dan Anda dapat menghapus semua filter dengan =kunci.


2
Ini adalah solusi yang lebih baik daripada jawaban yang diterima (solusi ini diajukan 3 tahun kemudian dari yang asli). Tidak seperti aslinya, solusi ini sebenarnya bekerja pada proses yang baru saja melahirkan juga. Sangat penting jika Anda memantau proses Apache yang dibuat sesuai permintaan.
Nate Lampton

2
Memang solusi yang lebih baik karena filter langsung. Solusi yang diterima menyelesaikan id proses sebelum menjalankan top. Proses yang dihasilkan seperti top -c -p 920,1345,1346yang diperbaiki.
Jérôme Gillard

4
Menggunakan osebagai filter tidak ada di beberapa versi teratas (yang lebih lama): top: procps version 3.2.8Filter pengguna ada, sehingga berfungsi.
Manwe

13

Perintah @ perreal bekerja sangat baik! Jika Anda lupa, coba dalam dua langkah ...

contoh: filter atas untuk hanya menampilkan aplikasi yang disebut yakuake:

$ pgrep yakuake
1755

$ top -p 1755

perintah interaktif atas yang berguna 'c': beralih jalur penuh vs nama perintah 'k': bunuh dengan PID 'F': filter dengan ... pilih dengan panah ... lalu tekan 's' untuk mengatur jenis

jawabannya di bawah juga bagus ... Saya mencari itu hari ini tetapi tidak dapat menemukannya. Terima kasih


7

Setelah mencari begitu banyak jawaban di StackOverflow, saya belum melihat jawaban yang sesuai dengan kebutuhan saya.

Artinya, untuk membuat perintah teratas untuk tetap menyegarkan dengan kata kunci yang diberikan, dan kita tidak perlu CTRL + C / atas lagi dan lagi ketika proses baru muncul.

Jadi saya membuat yang baru ...

Ini dia versi no-restart-diperlukan.

__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;)

Ubah kata sandi __ dan itu akan berfungsi. (Ubuntu 2.6.38 diuji)

2.14.2015 menambahkan: Bagian beban kerja sistem tidak ada dengan kode di atas. Untuk orang yang peduli dengan bagian "rata-rata beban":

__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;)

ini tidak memiliki gambaran umum tentang beban kerja sistem. tambahkan "uptime" sebelum tidur, untuk daftar proses pendek, ini cukup IMHO.
Sevyls

1
@Sevyls Terima kasih telah menunjukkan! Setelah beberapa upaya lainnya (yang tidak berfungsi sebaik) versi Anda mungkin salah satu yang terbaik. Jawaban diubah.
Val

Bekerja dengan baik jika saya memiliki satu atau lebih proses yang menjalankan kecocokan itu tetapi saya mendapatkan "top: Invalid user" ketika semua berhenti. Itu pulih ketika proses lain dimulai. Saya menjalankan FYI Raspbian. Terima kasih.
Mike

1

bagaimana dengan ini?

top -c -p <PID>

4
kami mencoba memfilter menurut nama proses (atau substringnya) dan ketika Anda memulai kembali proses Anda, Anda akan mendapatkan pid baru.
Srujan Kumar Gulla

1

Saya akhirnya menggunakan skrip shell dengan kode berikut:

#!/bin/bash

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

1

Sebagian besar jawaban gagal di sini, ketika daftar proses melebihi 20 proses. Itu adalah top -pbatas opsi. Bagi mereka dengan top yang lebih tua yang tidak mendukung pemfilteran dengan oopsi, berikut adalah contoh skrip untuk mendapatkan outuput layar / konsol penuh (informasi ringkasan tidak ada pada output ini).

__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 )

Beberapa penjelasan

__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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.