web-dev-qa-db-ja.com

TOPコマンドの出力を特定のプロセス名に制限する

Topコマンドを呼び出すと、実行中のすべてのプロセスが取得されます。しかし、どうすれば出力のみを「Java」のような特定のプロセス名にlimit制限できますか?

私はこれを試しましたtop -l 2 | grep Javaしかし、この方法ではスナップショットのみを取得し、継続的に更新されるリストは取得しません。そして、top -l 0 | grep Javaは実際には明確ではありません。

78
Alex

私は次を好むので、実行するたびにpidを調べることなく対話的にtopを使用できます。

top -p `pgrep process-name | tr "\\n" "," | sed 's/,$//'`

もちろん、プロセスが変更された場合は、コマンドを再実行する必要があります。

説明:

  • pgrep process-nameは、改行で区切られたプロセスIDのリストを返します
  • tr "\\n" ","はtopがプロセスIDのコンマ区切りリストを必要とするため、これらの改行をコンマに変換します
  • sedはストリームエディターで、sed 's/,$//'は、末尾のコンマを削除するためにここで使用されます
130
Rick Byers

監視するプロセスのPIDを見つけて、-pオプションを使用すると、topコマンドにpidのリストを提供できます。

例:

top -p 18884 -p 18892 -p 18919

  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME CPU COMMAND
18884 user  25   0  672M  95M  9476 S     0.0  1.1   0:02   1 Java
18892 user  25   0 2280M 123M 12252 S     0.0  1.5   0:05   1 Java
18919 user  22   0 1492M 198M 28708 S     0.0  2.4   0:07   1 Java

(コンマ区切りのリストで渡すこともできると思います。)

53
dogbane

どのようにtop -b | grep Java

32
Faisal Feroz

@ dogbane's answer を展開すると、pgrepを使用して名前付きプロセスのすべてのPIDを取得し、以下を実行できます。

top -p "$(pgrep -d ',' Java)"
28
l0b0

watchコマンドを使用します

watch -d 'top -n1 | grep mysql'
6
tszming

here からの回答を使用して、1つのライナーを作成できました

top -pid $(pgrep process_name | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ -pid /g')

これはMacOS 10.12(Sierra)で動作します

4
bcjenkins

次のコードは、watchコマンドを使用して5秒ごとにプロセスのリストを更新します。

watch -n 5 -t top -b -n 1 -p$(pgrep Java | head -20 | tr "\\n" "," | sed 's/,$//')

2
gnod

実行します(例):top -b | egrep -w 'Java|mysqld'

2

私は次を使用して問題を解決しました:

トップ-n1 -b | grep「プロセス名」

この場合:-nはtopが何回処理するかを設定するために使用されます
and -bは、すべてのPIDを表示するために使用されます

次のようなエラーを防ぎます:top:pid limit(20)exceeded

2
Markomafs

..サーバー上で同じ名前で20を超えるプロセスが実行されている場合...これは役に立ちません

トップ-p pgrep Oracle | head -n 20 | tr "\\n" "," | sed 's/,$//'

より多くのリソースを消費する他のプロセスが失われる可能性が高い20プロセスのリアルタイム出力をリストして提供しようとします。

私はまだこれに関するより良いオプションを探しています

1
user3482072

以下を実行すると、コンソールで継続的な更新が行われます。

bcsmc2rtese001 [~]$ echo $Shell  
/bin/bash  
bcsmc2rtese001 [~]$ top | grep efare  or watch -d 'top | grep efare' or top -p pid
27728 efare     15   0 75184 3180 1124 S  0.3  0.0 728:28.93 tclsh  
27728 efare     15   0 75184 3180 1124 S  0.7  0.0 728:28.95 tclsh
0

ちょうどtop -bn 1 | grep Javaはあなたのためにトリックを行います

0
Guru

Rick Byersの回答に記載されているアプローチを使用します。

top -p `pgrep Java | paste -sd "," -`

しかし、20を超えるプロセスが実行されていたため、同様の状況に遭遇した人にとって次のコマンドが役立ちます。

top -p `pgrep Java | head -n 20 | paste -sd "," -`

pgrepは、指定された名前のプロセスのリストを取得します-Java。headは、-p引数の使用時にtopが20を超えるpidを処理できないため、最初の20 pidを取得します。最後にpasteが結合します。 「、」付きのPIDのリスト。

上記のコマンドで探しているプロセス名と、監視したいその名前のプロセスの数を制御できます。指定された名前のプロセスの数が20未満の場合、head -n 20部分を無視できます。

0
shaffooo

OSXでこれに対する答えを探してここに来ました。私は最終的にbashとawkで欲しいものを手に入れました:

topfiltered() {
  [[ -z "$1" ]] && return
  dump="/tmp/top_dump"
  rm -f "$dump"
  while :; do
    clear
    [[ -s "$dump" ]] && head -n $(( $LINES - 1 )) "$dump"
    top -l 1 -o cpu -ncols $(( $COLUMNS / 8 )) | awk -v p="$(pgrep -d ' ' $@)" '
        BEGIN { split(p, arr); for (k in arr) pids[arr[k]]=1 }
        NR<=12 || ($1 in pids)
    ' >"$dump"
  done
}

ログモードでtopをループし、awkでフィルター処理して、pgrepの出力から連想配列を作成します。 Awkは最初の12行を出力します。12行目は列ヘッダーで、次に配列内のキーであるpidを持つすべての行を出力します。ダンプファイルは、より監視可能なループに使用されます。

0
aktivb

私が実際に探していたような、より具体的なケース:

Javaプロセスの場合は、jps -qこれによりjps$ Java_HOME/binからのツールであり、したがって$ PATHにある必要があります。

0
Alex

MacOSのこれまでのonlyソリューションは次のとおりです。

top -pid `pgrep Java | awk 'ORS=" -pid "' | sed 's/.\{6\}$//'`

ただし、Javaプロセスが存在しない場合、これはinvalid option or syntax: -pidを望ましくない形で報告します。

[〜#〜]説明[〜#〜]

ここに投稿された他のソリューションはtop -p id1,id2,id3形式を使用しますが、MacOSのtopは扱いにくい形式top -pid id1 -pid id2 -pid id3のみをサポートします。

そのため、最初に、プロセス名が「Java」であるプロセスIDのリストを取得します。

pgrep Java

これをawkにパイプして、結果を区切り文字" -pid "で結合します

| awk 'ORS=" -pid "'

悲しいかな、これは末尾の区切り文字を残します!たとえば、これまでに文字列"123 -pid 456 -pid 789 -pid "を取得した可能性があります。

次に、sedを使用して、区切り文字の最後の6文字を削除します。

| sed 's/.\{6\}$//'`

結果をtopに渡す準備ができました。

top -pid `...`
0
Anti Earth