web-dev-qa-db-ja.com

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

top -c

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

たとえば、プロセス名のtop -someオプション-substringのようにしたい場合、topはコマンド名にこのサブストリングのみを含むPIDを表示します

120
user1615330

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

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

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

180
perreal

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

top -cを実行した後、ヒット o 列にフィルターを作成します。 COMMAND列に文字列fooが含まれる行を表示するには、COMMAND=fooと記述します

基本的な出力が必要な場合は、これで十分かもしれません。

top -bc |grep name_of_process
94
nos

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

64
Don Kirkby

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

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

$ pgrep yakuake
1755

$ top -p 1755

便利なトップインタラクティブコマンド 'c':フルパスとコマンド名の切り替え 'k':PIDで強制終了 'F':フィルターで...矢印で選択...を押してソートを設定

以下の答えも良いです...私は今日それを探していましたが、それを見つけることができませんでした。ありがとう

11

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

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

__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
1
Manwe

次のコードでシェルスクリプトを使用することになりました。

#!/bin/bash

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

これはどうですか?

top -c -p <PID>
1
Satish