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


81

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

私はこのトップを試しました -l2 | grep javaです が、この方法ではスナップショットのみを取得し、継続的に更新されるリストは取得しません。そしてトップ-l0 | grepjavaは実際には明確ではありません。


5
残念ながら、これまでのところ、-pと-bはOS Xのtopコマンドでサポートされていないため、有効な答えはありません。
アレックス

私は多分以下の最初のOSXソリューション何掲載しました-とちょうど時間のニックで;)
反地球

回答:


131

私は次のことを好みます。そうすれば、実行するたびにpidを検索しなくても、topをインタラクティブに使用できます。

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

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

説明:

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

2
ベストアンサーは、dogbaneを改善して、多くのPIDを貼り付けるのではなく、実際に名前を入力できるようにします。(そしてこれはSOです)
sabgenton 2013年

1
できれば何度も投票したいと思いますが、これは本当に「受け入れられた」答えになるはずです。
spuriousdata

6
私は得ていtop: pid limit (20) exceededます。とにかくその制限の周りにありますか?
celwell 2013年

7
@celwell、試してみてくださいtop -p $(pgrep process-name | head -20 | tr "\\n" "," | sed 's/,$//')。これにより、によって返される最初の20個までのPIDのデータが表示されpgrepます。
acumenus 2013年

3
ヨセミテ(またはそれ以前?)の時点では、の-pid代わりになってい-pます。
最大

53

監視するプロセスの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

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


7
Macでは「top-pidID」である必要がありますが、Javaプロセスが複数ある可能性があるため、Javaプロセスにはいくつかの異なるIDが含まれる場合があります。
アレックス

32

top -bはどうですか?grep java


1
MacはGPLツールではなくBSDツールを使用しているため、Macでは機能しません。そして、いくつかの違いがあります。「-b」バージョンは「-l0」に似ていると思いますが、テーブルのヘッダーも印刷されていますか?
アレックス

29

@dogbaneの回答を拡張すると、名前付きプロセスのすべてのPIDを取得pgrepして、次のことを実行できます。

top -p "$(pgrep -d ',' java)"

2
これには最大20pidの制限があります
mrP

top -p "$(pgrep -d ',' php)" top: pid limit (20) exceeded
mrP 2015年

あなたが正しい!man top「このオプションは最大20回指定できます。または、最大20個のpidを含むカンマ区切りのリストを指定できます。」よくやった。
l0b0 2015年

6

watchコマンドを使用する

watch -d 'top -n1 | grep mysql'

「watch--d」である必要があります。ただし、このコマンドを実行しても出力が得られません。
アレックス

-1 ::man watch" watchはコマンドを繰り返し実行し、その出力とエラーを表示します"; 同じように、現在実行中のプロセスが表示されないtop
sdaau

@AlexanderOrlov、ここには特別な魔法はありません。top-n1を使用して印刷して終了し、watchを使用して継続的に監視します。
tszming 2013

@sdaau、あなたのコメントは私の答えとは無関係です。次回はもっと慎重に返信してください。
tszming 2013

1
-bオプションを追加する必要があると思います。watch -d 'top -b -n1 | grep mysql'
レイエスヤン

6

ここからの答えを使って、ワンライナーを作ることができました

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

これはMacOS10.12(Sierra)で動作します


2

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

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

この場合:-nは、topがどの
プロセスになるかを設定するために使用され、-bは、すべてのpidを表示するために使用されます。

:top:pid limit(20)を超えたようなエラーを防ぎます


2

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

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



1

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

top -p pgrep oracle | head -n 20 | tr "\\n" "," | sed 's/,$//'

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

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


0

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

以下のためのJavaプロセス、あなたも使用できるjps -qことにより、JPSがからツールです$ JAVA_HOME / binに、したがって、あなたの$ PATHにする必要があります。


0

私は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を持つすべての行が出力されます。ダンプファイルは、より監視しやすいループに使用されます。


OSXでは、pgrep <process_name>のようなものを使用できます。top -pid <pid_specified_by_pgrep>
bergercookie 2016

0

ただtop -bn 1 | grep javaあなたのためにトリックをします


0

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

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

MacOSのこれまでの唯一の解決策は次のとおりです。

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

ただし、稼働中invalid option or syntax: -pidjavaプロセスがない場合、これは望ましくないレポートになります。

説明

ここに掲載されている他のソリューションはこのフォーマットを使用していますtop -p id1,id2,id3が、MacOStopは扱いにくいフォーマットしかサポートしていません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

プロセスのpidを取得します。

# pidof <process>

表示するプロセスpidをトップに指示する

# top -p <pid1>,<pid2>, etc

例:

landis@linux-e6510:~>pidof konsole
1841 1709
landis@linux-e6510:~>top -p 1841,1709

Topには、2つの「konsole」プロセスのみが表示されます。これは、sshを介してビジー状態のサーバーで役立ち、grepを介してパイプする必要はありません。


申し訳ありませんが、問題のmacosタグが表示されませんでした。私のLinuxボックスはすべて動作します。
ランディスリード

-1

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のリストを「、」で結合します。

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

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