Linuxのtop -cコマンドで、プロセス名に基づいてリストされたプロセスをフィルタリング


149
top -c

トップにはすべてのプロセスが一覧表示されます。オプション-uを使用してユーザー名でプロセスをフィルタリングするための優れたオプションがありますが、トップ出力のCOMMAND列にリストされているプロセス名に基づいてプロセスをフィルタリングする簡単な方法があるかどうか疑問に思っています。

たとえば、プロセス名のtop -someオプション-substringを使用すると、topはコマンド名にこの部分文字列のみを含むpidを表示します

回答:


213

pgrepを使用して、一致するコマンドラインのpidを取得します。

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

top -pはpidのコンマ区切りのリストを想定しているため-d','、pgrepで使用します。-fpgrep のフラグは、プログラム名ではなくコマンドラインと一致させます。


12
新しいプロセスが「string_to_match_in_cmd_line」に対して生成された場合、それらは上部に表示されないことを覚えておいてください。topを終了してこのコマンドを再実行する必要があります
eugenevd

1
eugenevdが言ったように、これはtopが呼び出された後に開始された新しいプロセスに対しては機能しません。そうする方法はありますか?名前に同じプレフィックスを付けていくつかのプログラムを実行する必要があります。そのたびに新しいtop(または単にps)を実行する必要なく、それらのいくつがライブで実行されているかを確認したいと思います。
Jester、2014年

1
@ Jester、eugenevd、私はあなたと同じ問題を抱えていました。私はstackoverflow.com/a/27653841/681830で新しいバージョンを作成しました。
Val

5
私が遭遇したtop: pid limit (20) exceededので、これを使用しました:top -c -p $(pgrep -f string_to_match_in_cmd_line | head -20 | tr "\\n" "," | sed 's/,$//')
f01、16年

115

インタラクティブに行うことができます

を実行した後、列にフィルタをtop -cヒットoして書き込みます。たとえば、COMMAND列に文字列fooが含まれている行を表示するには、次のように書き込みます。COMMAND=foo

基本的な出力だけが必要な場合は、これで十分です。

top -bc |grep name_of_process

7
これにより、「無効なオプションまたは構文:-bc」
shmim

3
top -bc -n 1 それは1に反復の数を制限するように、より便利である
galath

1
これは受け入れられる答えになるはずです。より正確で、「top」コマンドで提供されるオプションでのみ機能します。そして、それは新しいプロセスを示しています。
アブラハムTS

プロセスは、で消え続け、再び現れ続けtop -c , hit o and write a filter on a columnます。
MrR 2018年

92

top実行中にフィルターを追加できoます。キーを押してフィルター式を入力するだけです。たとえば、すべてのJavaプロセスを監視するには、フィルター式を使用しますCOMMAND=java。キーをもう一度押すことで複数のフィルターを追加でき、uキーでユーザー別にフィルターでき、キーですべてのフィルターをクリアでき=ます。


2
これは、受け入れられた回答よりも優れたソリューションです(このソリューションは、元の回答より3年遅れて提出されました)。オリジナルとは異なり、このソリューションは実際には新しく生成されたプロセスでも機能します。オンデマンドで作成されたApacheプロセスを監視する場合は非常に重要です。
Nate Lampton 2016年

2
それはライブでフィルターするので、確かにより良いソリューションです。承認されたソリューションは、topを実行する前にプロセスIDを解決します。結果として生じるプロセスはtop -c -p 920,1345,1346、修正されたようなものです。
ジェローム・ギラード

4
otopの一部の(古い)バージョンでは、フィルターとしての使用は存在しません。top: procps version 3.2.8ユーザーフィルターが存在するため、機能します。
Manwe 2017年

13

@perrealのコマンドは素晴らしい働きをします!忘れた場合は、2つのステップで試してください...

例:topをフィルタリングして、yakuakeというアプリケーションのみを表示します。

$ pgrep yakuake
1755

$ top -p 1755

便利なトップインタラクティブコマンド 'c':フルパスとコマンド名の切り替え 'k':PIDによるkill 'F':フィルター...矢印で選択...次に 's'を押して並べ替えを設定

以下の答えもいいです...今日はそれを探していましたが見つかりませんでした。ありがとう


7

StackOverflowで非常に多くの答えを探した後、自分のニーズに合う答えを見つけていません。

つまり、topコマンドを指定したキーワードで更新し続けるようにします。新しいプロセスが起動するときに、CTRL + C / topを何度も繰り返す必要はありません。

したがって、私は新しいものを作ります...

ここに再起動不要のバージョンがあります。

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

__keywordを変更すれば動作するはずです。(Ubuntu 2.6.38テスト済み)

2.14.2015を追加:上記のコードでシステムワークロードの部分が欠落しています。「負荷平均」の部分を気にする人のために:

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

これには、システムのワークロードに関する概要がありません。スリープの前に「稼働時間」を追加します。短いプロセスリストの場合、これで十分です。
Sevyls、2015

1
@Sevyls指摘してくれてありがとう!他の数回の試行(それでも十分に機能しない)の後、バージョンは最高のバージョンの1つになる可能性があります。回答が変更されました。
Val

その一致を実行しているプロセスが1つ以上ある場合は問題なく動作しますが、すべて停止すると「top:Invalid user」が表示されます。別のプロセスが開始すると回復します。Raspbian FYIで実行しています。ありがとう。
Mike

1

これはどうですか?

top -c -p <PID>

4
プロセス名(またはそのサブストリング)でフィルタリングしようとしています。プロセスを再起動すると、新しいPIDが取得されます。
Srujan Kumar Gulla 2012

1

次のコードでシェルスクリプトを使用してしまいました。

#!/bin/bash

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

1

プロセスリストが20プロセスを超えると、ほとんどの回答はここで失敗します。それはtop -pオプションの制限です。oオプションでのフィルタリングをサポートしていない古いtopを持つ人のために、全画面/コンソール出力を取得するスクリプト可能な例を次に示します(この出力には要約情報がありません)。

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

いくつかの説明

__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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.